这些代码意味着什么:
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);
}
有人可以解释一下吗?
答案 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. */
...