POSIX线程,使用结构

时间:2017-01-11 00:27:39

标签: c++ multithreading concurrency pthreads posix

所以我花了最后几个小时试图谷歌并弄清楚我的代码有什么问题,但我想不通。

我是学生,我刚开始学习线程等,所以这对我来说都是全新的,我不是很有经验。

谷歌(以及此处)的答案通常是代码中一个特定问题的答案,我无法弄清楚如何让这个东西真正起作用。

这是我的代码的一个非常简化的版本:

http://pastebin.com/wst8Yw8z

#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

using namespace std;

struct Data{
    string a;
    string b;
};

void* thread_func( void *param ){

    struct Data *input = (struct Data*)param;

    string data1 = input->a;
    string data2 = input->b;

    cout << "You said: " << data1 << " " << data2 << endl;

    return NULL;
}

int main( int argc, char *argv[] )
{
    pthread_t child;
    string arg, arg2;

    struct Data *input;

    cout << "Input 1: " << endl;
    cin >> arg;
    cout << "Input 2: " << endl;
    cin >> arg2;

    input->a = arg;
    input->b = arg2;

    pthread_create( &child, NULL, thread_func, (void *)&input);

    pthread_join( child, NULL );
    cout << "Synced" << endl;
    return 0;
}

所以我有一个struct Data,我想用它来将多个参数传递给函数thread_func。

我的代码实际编译(至少在linux上)但是当我输入两个值时,我得到了分段错误。

我显然做错了,我的猜测就是第18行,但是我没有足够的经验来解决这个问题,我要求你们帮忙。

我在这个结构中做错了什么来将多个参数传递给函数?

我的实际任务比这更复杂,但我尽力使其尽可能清晰。

2 个答案:

答案 0 :(得分:4)

main()函数中,这个:

struct Data *input;

创建指向struct Data的指针,但不会创建实际的struct Data对象本身。你需要在这里使用:

struct Data input;

然后:

input.a = arg;
input.b = arg2;

其余的应该可以正常工作。

答案 1 :(得分:3)

这一行:

struct Data *input;

将输入定义为指针,但它永远不会在以后使用它来存储字符串之前分配对象:

input->a = arg;
input->b = arg2;

根据您对pthread_create的调用,我怀疑您根本不希望input成为指针。删除*,然后将分配更改为:

input.a = arg;
input.b = arg2;