繁体   English   中英

在pthread_create()中,将int类型转换为void *是什么意思?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM