我正在编写一个程序,用于计算向量的“偶数”数。我输入了许多必须创建的线程来并行分析矢量。
结果始终必须为500,但有时会改变(485,512,586,410)。我想问题是线程的同步,但我正在使用连接,所以我不知道为什么这个问题仍然存在。
解决
我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/shm.h>
#include <pthread.h>
#define VECTOR_LENGTH 1000
int vector[VECTOR_LENGTH];
int sum = 0;
int quantity_positions;
void VerifyVector(int i){
int j = 0;
int vector_sum = 0;
for (j = (i * quantity_positions); j < ((i + 1) * quantity_positions); j++)
if ((vector[j] % 2) == 0)
vector_sum++;
//printf("Thread num %d sum value: %d\n", i, vector_sum);
pthread_exit(vector_sum);
}
int main(int argc, char*argv[]){
int i, j;
int threads = 0;
int rest = 0;
for (i = 0; i < VECTOR_LENGTH; i++)
vector[i] = i;
threads = atoi(argv[1]);
if (threads <= 0)
threads = 1;
int threads_result[threads];
pthread_t threads_id[threads];
quantity_positions = VECTOR_LENGTH / threads;
if ((quantity_positions * threads) != VECTOR_LENGTH)
rest = VECTOR_LENGTH - (quantity_positions * threads);
if (threads == 1)
for (i = 0; i < quantity_positions; i++){
if ((vector[i] % 2) == 0)
sum++;
}
else {
for (i = 1; i < threads; i++){
pthread_create(&threads_id[i], NULL, VerifyVector, i);
}
for(i = 1; i < threads; i++)
pthread_join(threads_id[i], &threads_result[i]);
for (i = 1; i < threads; i++)
sum += threads_result[i];
for (j = (0 * quantity_positions); j < (quantity_positions + rest); j++)
if ((vector[j] % 2) == 0)
sum++;
}
printf("The total is: %d\n", sum);
return 0;
}
答案 0 :(得分:1)
pthread_join()不是魔法。这不是一个同步机制,您应该使用它来保护多个访问的数据。它不会做你认为你需要的东西。
此外,无论如何你都不需要同步,因为在线程运行期间你没有改变向量。
你需要的是修复所有错误,如molbdnilo /我的评论中所述。停止使用令人困惑的i,j,k单字母变量,除非你真的需要,否则不要使用全局变量。修复数组索引。
我不明白所有'父进程'的东西:(