在C中同步线程

时间:2015-05-30 20:32:50

标签: c multithreading synchronization pthreads

我正在编写一个程序,用于计算向量的“偶数”数。我输入了许多必须创建的线程来并行分析矢量。

结果始终必须为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 个答案:

答案 0 :(得分:1)

pthread_join()不是魔法。这不是一个同步机制,您应该使用它来保护多个访问的数据。它不会做你认为你需要的东西。

此外,无论如何你都不需要同步,因为在线程运行期间你没有改变向量。

你需要的是修复所有错误,如molbdnilo /我的评论中所述。停止使用令人困惑的i,j,k单字母变量,除非你真的需要,否则不要使用全局变量。修复数组索引。

我不明白所有'父进程'的东西:(