将结构作为值参数传递给线程

时间:2017-11-05 15:17:29

标签: c multithreading struct pthreads

我想用线程向量创建多个线程,并且我试图传递一个结构,其中的值随每次调用而变化。问题是我不想将结构作为带有&的内存位置传递,因为每个线程都接收到不同的结构值。我想将结构作为值参数传递。当我尝试时,gcc编译器抛出一个错误:违规段(生成“核心”)。这是我的代码的一部分:

//the struct
struct intervalos{
  int from;
  int to;
  int number;
};


// the calls
for (int i = 0; i<=num ; i++){
    struct intervalos *inter;

    /*re asign the values of the struct...*/

    pthread_create( &vector[i], NULL, fun, inter);
}


//function of threads
void* fun(void* data) {
    struct intervalos *inter = data ;
    /* do something else */
}

3 个答案:

答案 0 :(得分:1)

您可以在堆上分配数据malloc系列中的一个函数。 pthread_create的调用者不会释放分配的内存,而是新的线程会在完成处理数据之后(可能是在初始处理之后或在线程退出之前,取决于线程执行的操作) )。

您可以以这种方式在线程之间传递堆指针这一事实使malloc变得更加复杂,因此您也可以使用此功能。

答案 1 :(得分:1)

您没有初始化inter变量,从而导致程序抛出段错误。 通常,在将指针传递给任何其他函数之前,您将 使用malloc()之类的调用为其分配内存。

或者,如果您坚持将未分配的指针传递给pthread_create函数,则可以传递对指针的引用,即pthread_create(&vector[i], NULL, fun, &inter),然后使用*inter = malloc(sizeof(struct intervalos))进行分配每个线程内的内存。

答案 2 :(得分:1)

您只能将指针传递给pthread_t,因此您无法通过引用按值传递数据。

struct intervalos * inter = malloc(sizeof(intervalos));
if (!inner) {
    // Handle out of memory error
}
inter->from = ...;
inter->to = ...;
inter->number = ...;

int error = pthread_create(&vector[i], NULL, fun, inter);
if (error) {
    // Thread was not created.
    // Free allocation to not leak memory.
    free(inner);
    // Handle cannot create thread error
}

在线程中:

void * fun ( void * data ) {
    struct intervalos * inter = data ;

    // ... Do whatever you want ...

    // Once done, free allocation or you'll leak memory
    free(inter);
    return NULL;
}