0

我是 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;

}
4

2 回答 2

2
sum1 = pthread_create ( &thread1, NULL, sum_function, (void*) lim1);
sum2 = pthread_create ( &thread2, NULL, sum_function, (void*) lim2);

这会将10and传递20void *线程。

for (int j = 0; j < (*(int*)lim); j++)

这会将10and转换20为 anint *然后取消引用它们。但它们不是有效的指针。

如果你想让线程接收一个地址,你必须给它一个地址。如果要向线程传递一个值,请对其进行编码以接收一个值。

您可以通过两种方式解决此问题:

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现在正在传递一个整数值,并且线程现在需要一个整数值。

于 2012-06-01T05:13:03.857 回答
0

这与标题没有直接关系。我正在解决你目前的情况。您可以创建一个结构。

struct args
{
    int arr_limit;
    int local_result;
};

然后根据需要填充此结构,并将地址作为void指向pthread_create函数的指针传递。你可以解决你的两个问题..希望这会有所帮助......

于 2012-06-01T05:54:16.707 回答