0

我试图将一个结构作为参数传递给 pthread_create 并且似乎得到了一些奇怪的结果。

该结构有两个成员,第一个是 int,第二个是函数指针:

typedef struct
{
  int num;
  void (*func)(int);
} foo_t;

我试图在结构中使用的函数:

void myfunc(int mynum)
{
   printf("mynum: %d\n", mynum);
}

这是我将传递给我的线程的结构的声明:

foo_t f;
f.num = 42;
f.func = &myfunc;

对 pthread_create 的调用:

pthread_create(&mythread, NULL, mythreadfunc, &f);

最后,我的线程函数:

void mythreadfunc(void *foo)
{
   foo_t f = *(foo_t *)foo;
   printf("num: %d\n", f.num); // Prints: num: 32776 (undefined?)
   (*f.func)(f.num);  // Segfaults (again, undefined?)
...

似乎 mythreadfunc 中的强制转换似乎不起作用,我不知道为什么。有什么建议么?谢谢。

4

2 回答 2

1

您正在通过foo_t f引用传递您的。如果您fpthread_create-calling 函数或其他地方更改您的,例如离开相应的范围将从f堆栈中删除/删除,那么您在线程中的引用(很可能)无效。至少你不应该再访问它了。

改为使用带有动态分配变量的指针。

尽管我无法证明您提供的代码正在发生这种情况。

编辑:

指针用于存储对象/变量的地址。C/C++你可以让它指向一个动态分配的内存段。寻找malloc/new这个。您可以使用指针执行所谓的操作dereferencing并访问对象/变量本身。

您可以传递每个值的指针,这意味着您不会传递对象/变量本身,而是传递 RAM 中对象/变量的地址(= 位置)。动态分配的变量/对象的内存管理是程序员的责任,所以当指针范围结束时你的对象不会被删除,只会删除存储地址的指针。

于 2012-08-20T12:03:03.220 回答
1

Papergay 的答案绝对是一种解决方案,但是如果您想避免动态分配,可以使用的另一种方法就是使用同步。我最喜欢的方法是在结构中放置一个初始值为零的信号量,让父级在信号量上等待,子级在完成从结构中读取值后发布信号量。

于 2012-08-20T12:07:45.077 回答