3

LinuxでC pthreadsを使用して、2つのスレッドがあります。1 つはデータを書き込み、もう 1 つはそれを読み取ります。変数を使用して、読み取りが許可されているときに読み取りスレッドを許可し、許可されているときに書き込みスレッドを許可しています。したがって、ミューテックスは「newData」と呼ばれるこのブール変数に適用されます。私の質問は、「if」条件内のアクセスの周りでミューテックスをロック/ロック解除する必要がありますか? どちらの方法でも機能しますが、この変数に対して書き込み/読み取りが重複する可能性が非常に低いという理由だけで考えています。私の質問をよりよく説明するために、両方の選択肢を示します。

スレッド 1:

pthread_mutex_lock( &lattice_mutex );
if (!newData) {
    pthread_mutex_unlock( &lattice_mutex );
    uchar *lattice_pos = lattice;
    int i;
    for(i=0; i<size; i++) {
        *lattice_pos = rand()%CHAR_MAX;
        lattice_pos++;
    }
    pthread_mutex_lock( &lattice_mutex );
    newData = TRUE;
    pthread_mutex_unlock( &lattice_mutex );
} else {
    pthread_mutex_unlock( &lattice_mutex );
}

スレッド 2:

pthread_mutex_lock( &lattice_mutex );
if(newData) {
    pthread_mutex_unlock( &lattice_mutex );
    renderUpdate();
    pthread_mutex_lock( &lattice_mutex );
    newData = FALSE;
    pthread_mutex_unlock( &lattice_mutex );
} else {
    pthread_mutex_unlock( &lattice_mutex );
}

2 番目のバージョンは機能しますが、正しいかどうかはわかりません。

スレッド 1:

if (!newData) {
    uchar *lattice_pos = lattice;
    int i;
    for(i=0; i<size; i++) {
        *lattice_pos = rand()%CHAR_MAX;
        lattice_pos++;
    }
    pthread_mutex_lock( &lattice_mutex );
    newData = TRUE;
    pthread_mutex_unlock( &lattice_mutex );
}

スレッド 2:

if(newData) {
    renderUpdate();
    pthread_mutex_lock( &lattice_mutex );
    newData = FALSE;
    pthread_mutex_unlock( &lattice_mutex );
}
4

2 に答える 2

3

最初のバージョンは正しいです。書き込みと読み取りの両方でミューテックスが必要です。

ただし、知る限り、そこにあるほとんどすべてのアーキテクチャには、1単位のデータ(intなど)アトミックへの単純な読み取りおよび書き込みアクセスがあります。ただし、メモリの順序付けが弱いアーキテクチャでは、実際にデータがバッファに格納される前に「buffer-full」フラグが true になるなどの問題が発生する可能性があることに注意してください。

コードは決してスリープ状態にならない (ビジー待機を使用する) ため、おそらく最善の方法ではないことに注意してください。いずれかのスレッドでデータを待ちたい場合は、ミューテックスで条件変数を使用する必要があります。

于 2009-03-03T17:49:53.683 に答える