首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pthread_create()中,int type转换为void*是什么意思?

在pthread_create()中,int type转换为void*是什么意思?
EN

Stack Overflow用户
提问于 2013-05-22 11:36:32
回答 1查看 133关注 0票数 1

这样的代码是什么意思:

代码语言:javascript
复制
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

代码语言:javascript
复制
UDTSOCKET recver = (UDTSOCKET)(unsigned long)usocket;

我觉得应该是

代码语言:javascript
复制
pthread_create(&rsvthread, NULL, recvAndSend, (void *)((unsigned long*)&recver));

代码语言:javascript
复制
void* recvAndSend(void* usocket)
{
    UDTSOCKET recver = (UDTSOCKET)(unsigned long)(*usocket);
}

有人能解释一下吗?

EN

回答 1

Stack Overflow用户

发布于 2013-05-22 14:47:21

第一种方法通过值传递,第二种方法通过引用传递。

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

当通过值传递时,变量的值在对pthread_create()的调用期间被复制到堆栈,这具有这样的效果,即在调用返回后可以立即再次使用原始变量。

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

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

这可能行得通,也行不行。

如果这样做,请确保使用整数类型,该类型保证与指针的大小相同。对于有符号的整数是intptr_t,对于无符号的整数是uintptr_t

要传入数据:

代码语言:javascript
复制
#include <stdint.h> /* for intptr_t */

...

pthread_create(&rsvthread, NULL, recvAndSend, (void *)((intptr_t) recver));

提取数据的步骤:

代码语言:javascript
复制
void * recvAndSend(void * pvsocket)
{
  UDTSOCKET recver = (UDTSOCKET) ((intptr_t) pvsocket);
  ...

第二种方法是可移植的方法,假设我们使用的是C语言,请执行以下操作

要传入数据:

代码语言:javascript
复制
pthread_create(&rsvthread, NULL, recvAndSend, &recver);

提取数据的步骤:

代码语言:javascript
复制
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. */
  ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16683066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档