我最近開始學習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