我使用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,这是正确的,但有时候是一个非常奇怪的数字。
我做错了什么?谢谢 。
答案 0 :(得分:1)
正如我在上一个问题中告诉你的那样,随机数字的原因是你在使用前没有初始化你的总和。您的代码也存在其他问题(请参阅注释),但它们并不直接对随机结果负责。
您当前的代码中根本不需要使用任何互斥锁。事实上,通过使用互斥锁,您可以使您的应用程序有效地实现单线程,从而降低所有多线程优势。您可能需要互斥锁的唯一位置是在cout
调用之前和之后 - 以确保输出不会交织在一起。
答案 1 :(得分:0)
您需要在代码中修复各种内容,但最棘手的问题是导致问题的是使用未初始化的变量 - &gt; sum
。