[英]What does int type convert to void* mean in pthread_create()?
这样的代码是什么意思:
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);
}
有人可以解释吗?
第一种方法确实按值传递,第二种方法确实按引用传递。
注意 :将数据传递到线程函数的方式对返回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. */
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.