我想用线程向量创建多个线程,并且我试图传递一个结构,其中的值随每次调用而变化。问题是我不想将结构作为带有&的内存位置传递,因为每个线程都接收到不同的结构值。我想将结构作为值参数传递。当我尝试时,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 */
}
答案 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;
}