我最近开始学习POSIX线程,并且我知道当你有两个线程Main和B时,如果在线程B的创建中引用变量作为void指针,线程B可以连续地在线程Main中更改一个变量。在运行时更改线程的void指针会发生什么?
这使我想知道如何让线程在线程B中不断更改变量。我编写了一个程序来测试是否更改发送的参数通过运行线程B更改线程B,然后更改引用的变量。它没有做任何事情。这个结果是正确的吗?
所以基本上:
void *someFunc(void *var) {
int *num=(int*) var;
int num2=*num;
while (true) {
if (num2==1) {
*num=3;
} else {
*num=5;
}
}
return NULL;
}
someVar=1;
pthread_t threadB;
if(pthread_create(&threadB, NULL, someFunc , &someVar)) {
return 1;
}
someVar=2;
//then join both threads later and print someVar
//will someVar be 3 or 5?
基本上,当我参考使用线程创建的空指针的变量,将未来该变量的变化会影响新创建的线程?如果不是这样,为了不断改变它,是否有一些特别要求呢?我应该看看锁/互斥锁还是仅将someFunc放入类中并更改其初始化变量? 谢谢!
它被称为[Race Condition](http://stackoverflow.com/questions/34510/what-is-a-race-condition),它触发[undefined behavior](https://en.wikipedia.org/wiki/Undefined_behavior)(即不可能说出会发生什么)。另请注意,自从C++ 11 [在C++中有多线程的标准工具](http://en.cppreference.com/w/cpp/thread),并且不再需要pthread。 – Drop
为了更好地理解[顺序一致](https://en.wikipedia.org/wiki/Sequential_consistency)C++ 11的Data Race Free Memory模型,请参阅着名的Herb Sutter的讲话:[C++ and Beyond 2012:Herb Sutter - 原子<>武器](https://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-1-of-2) – Drop
我意识到我应该看看这类东西的全局变量。谢谢! – msun