使用pthread时的随机结果
Random results when using pthread
我用pthread写了一个简单的程序,但结果是随机的。。。。
#define NTHREADS 2
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
void *add(void* numbers){
pthread_mutex_lock( &mutex1 );
int *n = (int*) numbers;
float sum;
for(int i = 0; i < 5; i++){
sum = sum + n[i] +5;
}
cout << sum/5<<endl;
pthread_mutex_unlock( &mutex1 );
}
void *substract(void* numbers){
pthread_mutex_lock( &mutex1 );
int *n = (int*) numbers;
float sum;
for(int i = 0; i < 5; i++){
sum = sum + n[i] -10;
}
cout << sum/5<<endl;
pthread_mutex_unlock( &mutex1 );
}
main(){
pthread_t thread_id[NTHREADS];
int i, j;
int *numbers = new int[5];
numbers[0] = 34; numbers[1] = 2; numbers[2]= 77; numbers[3] = 40; numbers[4] = 12;
pthread_create( &thread_id[0], NULL, add, (void*) numbers);
pthread_create( &thread_id[1], NULL, substract, (void*) numbers );
pthread_join( thread_id[0], NULL);
pthread_join( thread_id[1], NULL);
exit(EXIT_SUCCESS);
}
程序的输出是随机的。。。。有时会出现
-2.42477e+26
23
有时它只得到一个奇怪的数字,比如
235.69118e+13
(empty space)
我也尝试过只使用一个线程,但结果仍然是随机的。例如,我只使用线程来计算"加法",结果有时是38,这是正确的,但有时是一个非常奇怪的数字。
我哪里做错了?非常感谢。
正如我在上一个问题中告诉您的那样,使用随机数的原因是在使用之前没有初始化总和。您的代码也存在其他问题(请参阅注释),但它们不对随机结果直接负责。
您也不需要在当前代码中使用任何互斥对象。事实上,通过使用互斥,您使应用程序有效地实现了单线程,从而释放了所有多线程的好处。唯一可能需要互斥的地方是在cout
调用前后,以确保输出不会交织在一起。
您的代码中有各种各样的问题需要修复,但最"棘手的问题"是使用未初始化的变量->sum
。
相关文章:
- C++剪贴板队列粘贴随机结果?
- 为什么我在这个模板上有随机结果?
- 我在运行函数 GetVolumeInformation() 时得到非常随机的结果
- 如果我在每个平台上使用相同的种子,随机结果会相同吗?
- 尝试以随机字符(长读取)打印字符串返回结果
- C 编程:在循环时运行 2 并从 loop1 获取数据的随机结果
- 随机洗牌似乎会产生相同的结果,但仅在前两个实例中产生相同的结果.我如何避免这种情况
- 我如何在 c++ 中执行随机结果,如下所示的代码
- C++时间()给我的结果几乎是随机的
- 生成随机骰子并测量结果的频率
- 生成随机QString每次都会产生相同的结果
- 简单的代码,看似随机的结果——这是由于过时的引用造成的吗
- C++随机字符串返回意外结果
- 为什么起始值会影响种子随机的结果
- 如何使用 std::mt19937 避免相同的随机结果
- 当我编译和运行C++时,随机生成器给出了相同的结果
- 使用pthread时的随机结果
- 如何创建一个不会重复结果的随机事件
- 为什么rand()/double(rand_MAX)的第一个结果不是随机的
- 为什么我得到随机结果与移位操作符(c++)