Я кодирую программу для подсчета «четных» чисел вектора. Я ввожу несколько строк, которые должны быть созданы для распараллеливания анализа вектора.Синхронизация потоков в C
Результат всегда должен быть 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;
}
Wots с «shmget» Темой в этом процессе не нужен явные вызовы для обмена памяти. –
я не см. * любую * синхронизацию. 'join' не синхронизируется между потоками, это только заставляет текущий поток ждать завершения какого-либо другого потока. Читайте о мьютексах. – molbdnilo
Я также обеспокоен тем, что вы, кажется, думаете, что индексы массива начинаются с 1. –