当线程的 void 指针在运行时发生更改时会发生什么情况?
What happens when a thread's void pointer is changed during runtime?
我最近开始学习 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 的运行速度。这种依赖关系是一种称为"竞争条件"的非确定性行为,您需要非常小心地避免它。
相关文章:
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 是什么导致了Unity 3D中的"错误线程异常"?
- 我的C++线程做错了什么?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- 正在连接的等待条件变量的线程会发生什么情况?
- 线程和互斥锁的使用有什么问题
- 等待线程的最佳方式是什么
- Vulkan默认情况下已经有多线程了吗
- 什么是线程锁返回代码值
- 使用多线程来模拟这种情况的好方法是什么
- 当线程的 void 指针在运行时发生更改时会发生什么情况?
- 在后台线程上创建的调度程序未关闭时会发生什么情况?如何确保调度程序已正确关闭
- 如果在其他线程仍在运行时调用exit(0),会发生什么情况
- 什么是线程间操作
- 什么是线程安全的方式来突破POCO::HTTPSClientSession::receiveResponse
- 在没有c++11的情况下,使用boost标记线程退出的正确方法是什么
- 函数执行结束时,向量中的线程会发生什么情况
- 什么是线程