Pthreadsを使用すると、スレッド1と2の間にグローバル共有変数foo
があるとします。mutexを使用せずにスレッド1からfoo
の値を読み取るのはスレッドセーフですか?スレッド1がfoo
を読み取る間、スレッド2がその値を変更していることは不可能ではないことに注意してください(ただし、あらかじめmutexをロックしているでしょう)。共有変数を読み書きはできませんが、スレッドセーフですか?
状況がこのようなものです:
#include <pthread.h>
...
int foo;
pthread_mutex_t mutex;
...
void *thread1(void *t) {
while (foo<10) {
// do stuff
}
pthread_exit(NULL);
}
void *thread1(void *t) {
...
pthread_mutex_lock(&mutex);
...
foo++;
...
pthread_mutex_unlock(&mutex);
...
pthread_exit(NULL);
}
int main() {
...
}
私は読み取りと書き込みの両方をロックする必要があると思います。そうでないと、「汚れた読み」の可能性があります。 – duffymo
あなたの例は2つの関数 'thread1()'を表示しているので明確ではありません。おそらく、あなたは 'thread1()'と 'thread2()'、あるいはそれに類するものを使うつもりです。書き込みは一般的に原子的であるという保証はないので、読み書きのためにmutexを使って 'foo'へのアクセスを保護する必要があります。 'foo'が構造型であれば、より深刻な問題になります。しかし、唯一安全な(sane)戦略は、共有変数を読み書きする前にmutexをロックすることです。 –