' pthread '的运行函数如何修改外部变量
How the run function of `pthread` modify the external variable?
下面是我的代码:
#include <pthread.h>
#include <iostream>
using namespace std;
void* compute_prime (void* args)
{
int candidate = 2;
int n = *((int*)args);
while(1) {
int factor;
int is_prime = 1;
for (factor = 2; factor < candidate; ++factor)
if(candidate % factor == 0) {
is_prime = 0;
break;
}
if(is_prime){
if(--n == 0)
return (void*)candidate;
}
++candidate;
}
return NULL;
}
int main()
{
pthread_t thread;
int which_prime = 5000;
int prime;
pthread_create (&thread, NULL, &compute_prime, &which_prime);
pthread_join(thread, (void**)&prime);
printf("The %d th prime number is %d.n", which_prime, prime);
};
输出为:The 0 th prime number is 48611.
我的困惑是"为什么which_prime
在主线程中变成0
"。
我认为在函数void* compute_prime (void* args)
中,n
是which_prime
的副本,那么修改是针对n
的,而不是针对which_prime
的,那么原因是什么?
This:
pthread_join(thread, (void**)&prime);
是不正确的,会导致未定义的行为。&prime
不是void**
,因为prime
不是void*
。注意,void**
是而不是一个"泛型指针指向指针"——它是一个普通指针,指向void*
。
你应该这样做:
void *prime_result;
pthread_join(thread, &prime_result);
prime = (int)prime_result;
最有可能的是,void*
和int
在您的系统上是不同的大小,所以试图访问*(void**)&prime
会导致内存损坏。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 独立读取-修改-写入顺序
- 在函数内部的声明中初始化数组,并在外部使用它
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 在 C++ 中从类外部修改类的成员
- 如何跟踪通过外部代码修改类变量的所有位置
- 如何从类外部修改向量
- 保护外部数据文件免受未经授权的修改
- 如何创建外部不可修改的变量
- 检查文件是否在应用程序外部被修改
- 视觉获取链接错误:C++中的外部.如何访问在文件 A 中修改的变量的值.CPP在另一个文件 B .CPP中修改
- 使用外部条件修改序列操作
- 为什么在C++允许从外部修改常量对象的指针成员变量的内存?
- c++中未解析的外部函数:Visual c++对方法签名的修改与dll中修改的方法不同
- 从复制构造函数外部修改对象成员时导致向量内存损坏,但从复制构造函数内部修改时不会
- 检查我的 const 变量是否尚未在外部修改
- ' pthread '的运行函数如何修改外部变量
- cv::使用cv::imdecode后不修改外部数据