-1

私は同期などを意味するものではありません。これは、実際には一般的に良いプログラミング手法ではありません。ただ、やるべきことがあると思います。

たとえば、自分でサスペンドし、イベントが発生するまで待機するスレッドがあるとします。多くの場合、そのスレッドが中断する前にイベントが発生します。

そのため、イベントが発生する前に、スレッドが一時停止するまでイベントを待機させたいと考えています。

それ、どうやったら出来るの?

たとえば、mainQueue で 5 つのことをしたいとします。

何かをしてください。終わるまで待って、次へ。

私はこれを行います:

-(void) vDoSomeStuffsInSequence:(NSArray *) arblArrayOfBlocksToExecuteOnMainThread
{
    if (self.blockThis) {
        PO(@"Cancel Push View Controller");
        return;
    }
    @synchronized(self)
    {
        self.blockThis=true;
    }
    AssertMainThread

    NSMutableArray * arblNotFirstBlocks = [arblArrayOfBlocksToExecuteOnMainThread mutableCopy];

    void(^blockToExecute)() = arblNotFirstBlocks[0];//execute first block right away
    blockToExecute();
    PO(@"execute pop push etc");
    [arblNotFirstBlocks removeObjectAtIndex:0];


    [[NSOperationQueue new] addOperationWithBlock:^{
        PO(@"before first suspend");
        [self vSuspendAndHaltThisThreadTillUnsuspended]; //This often happen after (instead of before) the code that execute [self vContinue is called]
        PO(@"after first suspend");
        for (void(^blockToExecute)() in arblNotFirstBlocks) {

            while(false);
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                blockToExecute();//dothisfirst must unsuspend a thread somewhere
            }];

            [self vSuspendAndHaltThisThreadTillUnsuspended];
        }
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            @synchronized(self)
            {
                self.blockThis=false;
            }
            [self vContinue];
        }];
        [self vSuspendAndHaltThisThreadTillUnsuspended];
        PO(@"finish vDoSomeStuffsInSequence");
    }];
}
4

2 に答える 2

2

あなたが説明しているのは、多くのイベント配信システムで発生するよく知られた競合状態であり、解決策はシステムのプログラミング インターフェイスの詳細に依存します。

たとえば、Unix シグナルを検出すると、この競合状態が発生する傾向があり、(さまざまな移植性の) 解​​決策がいくつかあります。それらのいくつかについては、 Event Loop Wikipedia ページの「Handling Signals」を参照してください。

したがって、質問に対する答えは、検出するイベントと、それらを検出するために使用できるプログラミング インターフェイスに完全に依存します。より具体的な回答が必要な場合は、投稿を編集して詳細を含める必要があります。

于 2013-05-14T03:20:12.267 に答える