文档章节

pthread_t的定义

Maserati_
 Maserati_
发布于 2015/12/14 11:50
字数 376
阅读 1379
收藏 0

最近做一个跨平台的项目,需支持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)还是有差异性的

© 著作权归作者所有

Maserati_
粉丝 2
博文 9
码字总数 3899
作品 0
杭州
私信 提问
加载中

评论(1)

老汉-憨憨
老汉-憨憨
pthread_id_np_t tid;
tid = pthread_getthreadid_np();

或者

pthread_id_np_t tid;
pthread_t self;
self = pthread_self();
pthread_getunique_np(&self, &tid);
pthread_cancel,pthread_killall 段错误

前几天一个程序老是出现段错误,最后实在找不到地方,用gdb单步,发现问题出现在一个回调函数的pthreadcancel中。这个问题就奇怪了。《Unix系统编程》上说了pthreadcancel没有定义必须检测的...

wwliu
2012/09/17
1K
0
Linux系统编程(2)

一 exec函数 e:env int execle(const char path, const char arg,..., char const envp[]); 环境变量指针数组: char envp[] = {"环境变量名=内容",NULL}; 二 多线程 1.线程是进程中最小执行单......

baiweibi
2017/12/24
0
0
pthread的属性对象

1.概述 属性对象是为对象初始化提供额外参数的容器。可以简单的将属性对象想象为一个结构体,不过这个结构体的变量的读写需要通过提供的函数而不是用成员访问符直接操作其成员变量。属性对象...

wbf961127
2017/11/13
0
0
pthread_mutex_t的静态初始化

初始化phtreadmutext类型的变量时有两种方法:一种为使用宏PTHREADMUTEXINITIALIZER进行初始化,另外一种是使用函数pthreadmutexinit函数。第一种方法仅局限于静态初始化的时候使用:将“声明...

wbf961127
2017/11/13
0
0
POSIX 线程库功能接口与知识点汇总

POSIX 线程库功能接口与知识点汇总 —— Linux 平台 cnyinlinux 2016 元月 西安 库 : /lib64/libpthread.so* 头文件 : pthread.h 目 录 第一篇 线程创建与控制 第二篇 线程属性设置 第三篇 ...

cnyinlinux
2016/01/19
273
0

没有更多内容

加载失败,请刷新页面

加载更多

《JAVA核心知识》学习笔记 (21. JAVA 算法)

21. JAVA 算法

Shingfi
13分钟前
4
0
redis 命令

redis 秒杀用到的 原子锁 :$redis->decr('jili_reward_goods_stock_' . $gifts_id) redis 秒杀用到的原子锁在秒杀过程中库存量增加 $redis->incrBy('key1', 10); redis 键查看重复:$redis-......

小小小壮
13分钟前
3
0
像智能手机一样管理云端应用:阿里云联合微软全球首发开放应用模型(OAM)

2019 年 10 月 17 日上午 9 点 15 分,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟在 QCon 上海《基于云架构的研发模式演进》主题演讲中,正式宣布: “今天,我们同微软联合发布...

阿里巴巴云原生
22分钟前
4
0
SpringBoot配置数据源

默认数据源 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 中,分别是: org.apache.tomcat.jdbc.pool.DataSource......

Gx_ww
26分钟前
4
0
Java应用在docker环境配置容器健康检查

在《极速体验docker容器健康》一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看。 实战环境信息 操作系统:macOS Catalina ...

程序员欣宸
27分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部