我正在研究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;
}
由于所有四个函数彼此独立并使用相同的输入,如何将每个操作放入一个线程并让函数(或线程)同时运行? 我想如果有一天我有一个非常大的数组并运行上面的程序,它将花费很多时间,但如果我可以同时运行函数,它将节省很多时间。
答案 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
函数,它等待函数完成并返回它的结果。很好,嗯?