使用pthread同步函数对数组执行一些简单的操作

时间:2015-12-07 17:35:00

标签: c++ multithreading pthreads

我正在研究pthread,但对如何使用pthread同步函数感到困惑。

例如,我有一个简单的代码来对数组执行某些操作,如下所示:

float add(int numbers[5]){
  float sum;
  for(int i = 0; i < 5; i++){
  sum = sum + numbers[i] +5;
  }
  return sum/5;
}
float subtract(int numbers[5]){
  float sum;
  for(int i = 0; i < 5; i++){
    sum = sum + numbers[i] -10;
  }
  return sum/5;
}
float mul(int numbers[5]){
  float sum;
  for(int i = 0; i < 5; i++){
    sum = sum + (float)numbers[i] * 1.5 ;
  }
  return sum/5;
}
float div(int numbers[5]){
  float sum;
  for(int i = 0; i < 5; i++){
    sum = sum + (float)numbers[i]/ 2;
  }
  return sum/5;
}

int main(){
  int numbers [5] = { 34, 2, 77, 40, 12 }; 
  float addition = add(numbers);

  float subtraction = subtract(numbers);

  float multiplication = mul(numbers);

  float division = div(numbers);

  cout << addition + subtraction + multiplication + division << endl;
    return -1;
}

由于所有四个函数彼此独立并使用相同的输入,如何将每个操作放入一个线程并让函数(或线程)同时运行? 我想如果有一天我有一个非常大的数组并运行上面的程序,它将花费很多时间,但如果我可以同时运行函数,它将节省很多时间。

1 个答案:

答案 0 :(得分:2)

首先,我怀疑,你不清楚如何将数组传递给函数。 float subtract(int numbers[5])没有说明传递数组的大小。它相当于float subtract(int numbers[])(无大小),而这相当于``float subtract(int * numbers)`(指向int的指针)。你的函数中也有一个错误,因为你没有在第一次使用之前初始化float(以及其他函数)。

考虑到这一点,整个减法函数最好这样写:

float subtract(int* numbers, const size_t size) {
  float sum = 0;
  for(int i = 0; i < size; i++) {
    sum = sum + numbers[i] -10;
  }
  return sum/5;
}

现在,一旦我们清除了函数本身,我们就可以解决多线程问题。我真的建议放弃pthreads而是使用C ++ 11线程功能。当您需要将结果作为函数的返回值返回时尤其如此。使用pthreads执行此操作需要太多输入。在C ++中执行此操作的相关代码看起来与此类似:

int numbers[] = {34, 2, 77, 40, 12}; // No need to provide array size when inited
auto sub_result = std::async(std::launch::async, &subtract, numbers, sizeof(numbers) / sizeof(*numbers);
auto div_result = .... 
// rest of functions
std::cout << "Result of subtraction: " << div_result.get();

现在,要掌握这一点很多:) std :: async是一种异步运行函数的方法,而不用担心多线程。线程的任务委托给编译器。它比使用pthreads更简洁 - 参见,调用与普通函数调用没有太大区别!唯一要记住的是它返回所谓的std::future对象 - 一个特殊的对象,你可以等到运行的函数完成执行。它还有一个get函数,它等待函数完成并返回它的结果。很好,嗯?