Mik*_*ike 7 c pthreads thread-safety
在没有任何同步实用程序的情况下,多个线程在C程序中的pthread之间使用相同的整数内存位置是否存在问题?
为了简化问题,
这个伪C说明了我的想法
void thread_main(int *a) {
//wait for something to finish
//dereference 'a', make decision based on its value
}
int value = 0;
for (int i=0; i<10; i++)
pthread_create(NULL,NULL,thread_main,&value);
}
// do something
value = 1;
Run Code Online (Sandbox Code Playgroud)
我认为它是安全的,因为一个整数占用一个处理器字,读/写一个字应该是最原子的操作,对吧?
Ben*_*igt 12
你的伪代码不安全.
虽然访问一个字大小的整数确实是原子的,这意味着你永远不会看到一个中间值,但是"在写入之前"或"在写入之后",这对于你概述的算法来说是不够的.
您依赖于写入的相对顺序a并进行其他一些唤醒线程的更改.这不是原子操作,在现代处理器上无法保证.
您需要某种内存栅栏来防止写入重新排序.否则,不能保证其他线程能够看到新值.