使用线程和通过信号量实现的屏障查找数组的最大值

时间:2016-09-27 18:42:36

标签: c pthreads semaphore barrier

我编写了用于实现C程序的骨架,该程序计算数组的最大值(大小总是2的幂)。它通过创建n / 2个线程找到最大值,每个线程计算其calcArray [2]中最多2个元素。接下来,将再次使用相同的线程成对地比较那些最大值。但是,在每个线程完成之后,它必须等待所有其他线程完成,然后才能开始下一次比较。

这是我的问题:

我遇到了一些问题。首先,我不确定如何动态地和递归地获得calcArray [2]。接下来,我不确定如何在main中创建线程(我的评论在哪里)。最后,我需要创建自己的屏障函数,它使用二进制信号量来实现等待。

这是我到目前为止所拥有的。我知道它是不完整的,我只是提供上下文,以便更好地回答上述问题。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <pthread.h> 
#include <string.h>


struct structMax {
    int max; 
}; 

void *calcThread(calcArray[2], **newNums) {
    for (int counter = 0; counter < ((log(n)/log(2)); counter++ {
        // if active, do work; else jump to barrier right away
        if (calcArray[0] > calcArray[1])
            newNums[counter] = calcArray[0];
        else
            newNums[counter] = calcArray[1];

        // barrier.wait()
        count = count/2; 
        if (count == 1) {
            printf(newNums[0]); 
            break; 
        }
    }

}

int main(){
// Get list of n numbers (each input on individual line) 
  int tmp, nums[3000], calcArray[2], newNums[3000], count;
  int x = 0;
  char line[64];

  /* read at least 63 characters or until newline charater is encountered with */
  /*    fgets(line, sizeof line, stdin) */
  /* if the first character is a newline, then it's an empty line of input */
  int n = 0;
  while ((fgets(line, sizeof line, stdin) != NULL) && (line[0] != '\n'))
    {
      /* parse the read line with sscanf */
      sscanf(line, "%d", &tmp);
      nums[n] = tmp;
      n++;
    }
  printf("Number of items: %d\n", n);
  for(; x < n; x++) {
    printf("%d\n", nums[x]);
  }

  int numThreads = n/2; 
  count = n; 
  calcThread(calcArray[2], newNums);

  // create threads 



  return 0;
}

0 个答案:

没有答案