这样的代码是什么意思:
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);
}有人能解释一下吗?
发布于 2013-05-22 14:47:21
第一种方法通过值传递,第二种方法通过引用传递。
注意:数据传递到线程函数的方式对调用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. */
...https://stackoverflow.com/questions/16683066
复制相似问题