在pthread_create()中int类型转换为void *的含义是什么?

时间:2013-05-22 03:36:32

标签: c pthreads

这些代码意味着什么:

int main() {
    typedef int UDTSOCKET;
    UDTSOCKET recver;
    pthread_create(&rsvthread, NULL, recvAndSend, (void *)(unsigned long)recver);
    return 0;
}

void* recvAndSend(void* usocket)
{
    UDTSOCKET recver = (UDTSOCKET)(unsigned long)usocket;
}

这样的代码是对的? (void *)(unsigned long)recver)的含义是什么,unsigned int如何转换为void*,以及void*如何转换为UDTSOCKET

UDTSOCKET recver = (UDTSOCKET)(unsigned long)usocket;

我认为应该是

pthread_create(&rsvthread, NULL, recvAndSend, (void *)((unsigned long*)&recver));

void* recvAndSend(void* usocket)
{
    UDTSOCKET recver = (UDTSOCKET)(unsigned long)(*usocket);
}

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

第一种方法通过值传递,第二种方法通过引用传递。

注意:数据传递给线程函数的方式对于在pthread_create()调用返回后如何使用变量具有重要影响。

传递值时,变量的值被复制到堆栈期间调用pthread_create(),这会产生效果,即原始变量可能是在呼叫返回后立即再次使用。

如果通过引用传递,则引用指向的值不会立即复制,但在以后的某个时间点,通常 pthread_create()之后返回。这与线程函数(传递给pthread_create())的方式的异步性质有关,因此传入的地址变量可以立即重用 not 。如果它应该被重用,则需要通过同步来访问它。


第一种方法利用了这样的事实:在某些平台上,整数的大小小于或等于指针的大小。

这可能有效。

如果采用这种方式,请确保使用保证与指针大小相同的整数类型。对于签名,intptr_t为无符号整数,uintptr_t

传递数据:

#include <stdint.h> /* for intptr_t */

...

pthread_create(&rsvthread, NULL, recvAndSend, (void *)((intptr_t) recver));

提取数据:

void * recvAndSend(void * pvsocket)
{
  UDTSOCKET recver = (UDTSOCKET) ((intptr_t) pvsocket);
  ...

第二种方法是可移植的方式,假设我们正在做C,请执行以下操作

传递数据:

pthread_create(&rsvthread, NULL, recvAndSend, &recver);

取出数据:

void * recvAndSend(void * pvsocket)
{
  UDTSOCKET recver = *((UDTSOCKET *) pvsocket); /* First cast to pointer to UDTSOCKET, then dereference this pointer to read out what it ispointing to. */
  ...