2015-05-30 9 views
-1

Я кодирую программу для подсчета «четных» чисел вектора. Я ввожу несколько строк, которые должны быть созданы для распараллеливания анализа вектора.Синхронизация потоков в 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; 
} 
+1

Wots с «shmget» Темой в этом процессе не нужен явные вызовы для обмена памяти. –

+0

я не см. * любую * синхронизацию. 'join' не синхронизируется между потоками, это только заставляет текущий поток ждать завершения какого-либо другого потока. Читайте о мьютексах. – molbdnilo

+1

Я также обеспокоен тем, что вы, кажется, думаете, что индексы массива начинаются с 1. –

ответ

1

pthread_join() не магия. Это не синхронизирующий механизм, который вы должны использовать для защиты данных при множественном доступе. Он не будет делать то, что вам кажется, что вам нужно.

Кроме того, вам не нужна синхронизация, так как вы не мутируете вектор во время выполнения потоков.

Что вам нужно, это исправить все ошибки, как указано в molbdnilo/мои комментарии. Прекратите использование путаных i, j, k однобуквенных vars и не используйте глобальные vars, если вам действительно не нужно. Исправьте индексирование массива.

Я не понимаю, все, что «родительский процесс» материал :(

+0

и прекратите использовать индексы и пойдите для указателей! :) – Pynchia

+0

это не ответ – specializt

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – Achrome

Смежные вопросы