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

What happens when a thread's void pointer is changed during runtime?

本文关键字:什么情况 线程 指针 void 运行时      更新时间:2023-10-16

我最近开始学习 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 指针引用变量时,将来对该变量的任何更改都会影响新创建的线程吗?如果这不是真的,为了不断改变它,是否有一些特别的要求?我应该查看锁/互斥锁还是只是将一些 Func 放入类并更改其初始值设定项变量?谢谢!

int num2=*num;

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

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

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