4

Programming With POSIX Threads (by David Butenhof) を読んでいて、pthread ライブラリを使用して次のように述べています。

直接または条件変数を待機することによって、スレッドがミューテックスをロック解除するときに確認できるメモリ値は、後で同じミューテックスをロックするスレッドでも確認できます。繰り返しになりますが、ミューテックスのロックが解除された後に書き込まれたデータは、ロックの前に書き込みが行われたとしても、ミューテックスをロックするスレッドによって必ずしも認識されるとは限りません。

突然、次のコードが有効かどうか疑問に思います。

スレッド A:

strcpy(buffer, "hello world");
pthread_spin_lock(&lock); // assuming the mutex in the statement above can be interchanged with spinlock. I don't see why it can't
pthread_spin_unlock(&lock);

スレッド B:

pthread_spin_lock(&lock);
pthread_spin_unlock(&lock);
// read buffer; assuming thread B has a copy of the pointer somehow

私の質問は次のとおりです。スレッド B はバッファ内の「hello world」を見ることができますか? 彼の声明に基づいて、そうすべきです。「通常の」方法は、共有「リソース」をロックで保護することだと理解しています。しかし、strcpy() がランダムな時間に発生し、プログラムの存続期間中に一度し​​か発生しないと仮定しましょう。また、スレッド A が pthread_spin_unlock() を呼び出した後、スレッド B が何らかの方法で pthread_spin_lock() を呼び出すと仮定しましょう :)

副次的な質問: バッファへの変更を他のスレッドから見えるようにするより速い方法はありますか? 移植性は問題ではなく、CentOS を使用しているとしましょう。私が考えることができる 1 つの代替手段は mmap() を使用することですが、pthread ライブラリを使用しないと変更がグローバルに表示されるかどうかはわかりません。

4

1 に答える 1