我是C ++编程以及线程实现的新手。我的目标是设计一个程序,它使用两个线程在一个数组的2个子范围(元素0-9和元素10-19)中添加元素,然后添加线程返回的值以表示所有元素的总和数组。我已经编写了以下代码,基于我对“gdb”调试器的有限知识,似乎我的问题是sum_function中的指针。我无法弄清楚我的错误。任何帮助表示赞赏!
#include <iostream>
#include <pthread.h>
using namespace std;
int arguments[20];
void *sum_function (void *ptr);
int main (void) {
pthread_t thread1, thread2;
int total, sum1, sum2 = 0;
int lim1 = 10;
int lim2 = 20;
for (int i = 0; i < 20; i++)
cin >> arguments[i];
sum1 = pthread_create ( &thread1, NULL, sum_function, (void*) lim1);
sum2 = pthread_create ( &thread2, NULL, sum_function, (void*) lim2);
pthread_join (thread1, NULL);
pthread_join (thread2, NULL);
total = sum1 + sum2;
cout << "OUTPUT \n" << total << "\n";
return (0);
}
void *sum_function (void *lim) {
int sum = 0;
for (int j = 0; j < (*(int*)lim); j++)
sum += arguments[j];
return (void*) sum;
}
答案 0 :(得分:2)
sum1 = pthread_create ( &thread1, NULL, sum_function, (void*) lim1);
sum2 = pthread_create ( &thread2, NULL, sum_function, (void*) lim2);
这会将10
和20
传递给线程的void *
。
for (int j = 0; j < (*(int*)lim); j++)
这会将10
和20
转换为int *
,然后取消引用它们。但它们不是有效的指针。
如果您希望线程接收地址,则必须向其传递地址。如果要向线程传递值,请对其进行编码以接收值。
您可以通过以下两种方式解决问题:
1)始终如一地传递并期待指针:
sum1 = pthread_create ( &thread1, NULL, sum_function, (void*) &lim1);
sum2 = pthread_create ( &thread2, NULL, sum_function, (void*) &lim2);
...
for (int j = 0; j < (*(int*)lim); j++)
请注意,pthread_create
现在正在向线程传递指针,并且该线程现在正在取消引用该指针。
2)始终如一地传递和期待值:
sum1 = pthread_create ( &thread1, NULL, sum_function, (void*) lim1);
sum2 = pthread_create ( &thread2, NULL, sum_function, (void*) lim2);
...
for (int j = 0; j < ((int)lim); j++)
请注意,pthread_create
现在传递一个整数值,并且该线程现在需要一个整数值。
答案 1 :(得分:0)
这与标题没有直接关系。我正在解决你目前的情况。您可以创建一个结构。
struct args
{
int arr_limit;
int local_result;
};
然后根据需要填充此结构,并将地址作为void
指针传递给pthread_create
函数。你可以解决你的问题..希望这有帮助...