在运行时更改线程的void指针会发生什么?

时间:2016-01-24 06:12:16

标签: c++ multithreading pointers posix

我最近开始学习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放入一个类并更改其初始化变量? 谢谢!

2 个答案:

答案 0 :(得分:1)

该行

int num2=*num;

创建主线程指向的数字的副本。因此,你有一场比赛:如果在复制之前改变了,那么就会发生一件事;否则,子线程将永远不会看到更改。

答案 1 :(得分:-3)

因为您通过指向someFunc传递someVar,然后将其复制到指针num,对someVar的任何更改都会立即更改* num的值。

但是num2不会受someVar更改的影响,因为num2是一个不同的变量,分配给线程B的堆栈。因此,while循环的结果将由线程分配给num2的值决定。开始。这可以是1或2,具体取决于主线程和线程B的运行速度。这种依赖是一种称为“竞争条件”的非确定性行为,你需要非常小心地避免它。