pthread_t win32 linux ios 不同,pthread_t的定义

最近做一个跨平台的项目,需支持Windows,GUN Linux平台。

线程使用了Pthread线程,其中有一个日志模块中需要打印线程ID,做一些调试。

众所周知获取线程ID的函数:pthread_self(),返回一个pthread_t类型的线程标识符。

Open Source POSIX Threads for Win32

pthread.h

/*

* Generic handle type - intended to extend uniqueness beyond

* that available with a simple pointer. It should scale for either

* IA-32 or IA-64.

*/

typedef struct {

void * p;                   /* Pointer to actual object */

unsigned int x;             /* Extra information - reuse count etc */

} ptw32_handle_t;

typedef ptw32_handle_t pthread_t;

这里的pthread_t是一个结构体,查看源代码可以得知,成员void *p其实是保存了CreateThread返回的WIN32线程句柄。

LINUX

pthread.h

/* Obtain the identifier of the current thread.  */

extern pthread_t pthread_self (void) __THROW __attribute__ ((__const__));

pthreadtypes.h

/* Thread identifiers.  The structure of the attribute type is not

exposed on purpose.  */

typedef unsigned long int pthread_t;

linux下的pthread很直白,就是一个无符号整数

Linux部分代码主要是在MAC上调试,在打印pthread_self()的时候,发现有好多的警告,随后查看头文件发现OSX上的pthread_t和linux的大不相同。

OS X El Capitan

pthread.h

__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0)

pthread_t pthread_self(void);

pthreadtypes.h

typedef __darwin_pthread_t pthread_t;

typedef struct _opaque_pthread_t *__darwin_pthread_t;

struct _opaque_pthread_t {

long __sig;

struct __darwin_pthread_handler_rec  *__cleanup_stack;

char __opaque[__PTHREAD_SIZE__];

};

struct __darwin_pthread_handler_rec {

void (*__routine)(void *); // Routine to call

void *__arg; // Argument to pass

struct __darwin_pthread_handler_rec *__next;

};

这里可以发现struct __darwin_pthread_handler_rec结构体原来是封装了pthread线程的函数入口和参数以及下一个节点

由此可见在很多细微的地方linux与unix(BSD)还是有差异性的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值