1

とにかく、これは初心者の質問に聞こえるかもしれませんが、GCD は初めてです。

次の 2 つのスレッドを作成して実行しています。最初のものは ivar にデータを入れmMutableArray、2 番目のものはそこから読み取ります。スレッドをロックおよびクロック解除して、クラッシュを回避し、コード スレッドを安全に保つにはどうすればよいですか?

// Thread for writing data into mutable array 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
if (timer) {
    dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * interval), interval * NSEC_PER_SEC, leeway);
    dispatch_source_set_event_handler(timer, ^{
        ...
        // Put data into ivar
        [mMutableArray addObject:someObject];
        ...
    });
    dispatch_resume(timer);
}

// Thread for reading from mutable array
dispatch_source_t timer1 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
if (timer1) {
    dispatch_source_set_timer(timer1, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * interval), interval * NSEC_PER_SEC, leeway);
    dispatch_source_set_event_handler(timer1, ^{
        ...
        if (mMutableArray) {
            // Read data from ivar
            SomeObject* someobject = [mMutableArray lastObject];
        }
        ...
    });
    dispatch_resume(timer1);
}
4

3 に答える 3

6

変数へのアクセスをロックすることで、GCD の利点を失うだけです。変更する変数 (この場合は変更可能な配列) に関連付けられたシリアル キューを 1 つ作成します。次に、そのキューを使用して書き込みと読み取りの両方を行います。これは、保証されたシリアル シーケンスで行われ、ロックのオーバーヘッドが最小限に抑えられます。詳細については、http://www.fieryrobot.com/blog/2010/09/01/synchronization-using-grand-central-dispatch/ の「非同期セッター」を参照してください。共有変数へのアクセスが関連するディスパッチ キューを介して行われる限り、同時実行性の問題は発生しません。

于 2012-06-17T13:20:00.673 に答える
1

私は自分のプロジェクトでミューテックスを使用しましたが、現時点でどのように機能するかに非常に満足しています。

ミューテックスを作成して初期化します

pthread_mutex_t *mutexLock;
pthread_mutex_init(&_mutex, NULL);

次に、コードの周りにロックを設定します。2番目のスレッドがロックを取得しようとすると、最初のスレッドによってロックが再び解放されるまで待機します。それでも、最初のスレッドが実際にスレッドに書き込んでいるかどうかを確認したい場合があることに注意してください。

pthread_mutex_lock(self_mutex);
{
    ** Code here
}
pthread_mutex_unlock(self_mutex);
于 2012-06-17T12:42:37.683 に答える
0

GCD を使用して、クリティカル セクションで @synchronized を引き続き使用できます

于 2012-06-17T11:31:54.237 に答える