我最近开始学习POSIX线程,并且我已经了解到当你有两个线程Main和B时,如果我在线程B的创建中引用该变量作为void指针,则线程B可以连续更改线程Main中的变量。
这让我想知道如何使线程Main不断更改线程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?
基本上,当我在线程创建中使用void指针引用变量时,对该变量的任何未来更改是否会影响新创建的线程?如果不是这样,为了不断改变它,是否有一些特殊要求呢?我应该查看lock / mutex还是只将someFunc放入一个类并更改其初始化变量? 谢谢!
答案 0 :(得分:1)
该行
int num2=*num;
创建主线程指向的数字的副本。因此,你有一场比赛:如果在复制之前改变了,那么就会发生一件事;否则,子线程将永远不会看到更改。
答案 1 :(得分:-3)
因为您通过指向someFunc传递someVar,然后将其复制到指针num,对someVar的任何更改都会立即更改* num的值。
但是num2不会受someVar更改的影响,因为num2是一个不同的变量,分配给线程B的堆栈。因此,while循环的结果将由线程分配给num2的值决定。开始。这可以是1或2,具体取决于主线程和线程B的运行速度。这种依赖是一种称为“竞争条件”的非确定性行为,你需要非常小心地避免它。