我编写了用于实现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;
}