1

这样的代码是什么意思:

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*转换为UDTSOCKETin

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);
}

有人可以解释一下吗?

4

1 回答 1

1

第一种方法确实按值传递,第二种方法确实按引用传递。

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

按值传递时,变量的值在调用期间被复制到堆栈中pthread_create(),其效果是,在调用返回后可以立即再次使用原始变量。

如果通过引用传递,则引用指向的值不会立即复制,而是在稍后的时间点复制,通常是 pthread_create()返回之后。这是由于线程函数(传递给pthread_create())启动方式的异步性质,因此已传入地址的变量无法立即重用。如果要重用,则需要同步访问它。


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

这可能有效或无效。

如果采用这种方式,请确保使用保证与指针大小相同的整数类型。这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. */
  ...
于 2013-05-22T06:47:21.320 回答