C ++分段错误(核心转储)错误 - 将指针/返回函数值转换为线程

时间:2012-06-01 05:09:28

标签: c++ multithreading segmentation-fault void-pointers

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

}

2 个答案:

答案 0 :(得分:2)

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

这会将1020传递给线程的void *

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

这会将1020转换为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函数。你可以解决你的问题..希望这有帮助...