2

I am stuck in a simple pointer/casting problem:

I am try to pass as a argument to the pthread function in pthread_create an array of 2 structs. Here is the code:

struct sockaddr_in addr_left, addr_right;
struct sockaddr_in* addr_vec [2] = {&addr_left, &addr_right};
pthread_create (&thread_forward,   NULL, thread_func_forward, (struct sockaddr**)addr_vec); 

Inside thread_func_forward:

void * thread_func_forward (void * argv) {
  struct sockaddr_in* addr_left = ((struct sockaddr_in*)argv + 0);
  struct sockaddr_in* addr_right = ((struct sockaddr_in*)argv + 1);
}

For some reason it does not work properly, the program can execute the last lines without segmentation fault but when I access to the members of the structs, they are completely changed

4

2 回答 2

3

您没有将线程参数转换回正确的类型。您的代码将 thread 参数强制转换为 a struct sockaddr_in *,但这不是正确的类型。addr_vec是一个指针数组,因此addr_vec将衰减为指向指针的指针。

由于您正在传递指向指针的指针,因此您应该在线程函数中将其转换为这样。然后,您需要取消引用它以获得所需的指针。

  struct sockaddr_in* addr_left = *((struct sockaddr_in**)argv + 0);
  struct sockaddr_in* addr_right = *((struct sockaddr_in**)argv + 1);

这些是指向来自创建线程的函数的本地自动变量的指针这一事实可能是也可能不是问题。这取决于该函数是否在这些变量超出范围之前等待线程完成。

于 2013-06-29T10:05:27.860 回答
1

addr_vec生活在自动存储中(即在堆栈上),但没有迹象表明您已采取任何措施来确保变量的生命周期至少持续到您在线程中访问它们的时间点。

简而言之,您需要在创建线程之前动态分配然后在线程中释放它,或者使用同步原语来防止您创建线程的函数在您在线程本身中获取副本之前返回。

于 2013-06-29T10:04:07.503 回答