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)还是有差异性的

转载于:https://my.oschina.net/fork/blog/543814

你可能感兴趣的:(pthread_t的定义)