函数原型:

#include<pthread.h>

int  pthread_create(pthread_t*thread,pthread_attr_t   *attr,

void * (*start_routine)(void *arg), void *arg);

参数

  第一个参数为指向线程标识符的指针。

  第二个参数用来设置线程属性。

  第三个参数是线程运行函数的地址。

  最后一个参数是运行函数的参数。

返回值:

若成功则返回0,否则返回出错编号

代码:

#include <stdio.h>
#include <pthread.h>
#include <sys/syscall.h>void* Func_pth1()
{printf("child gettid = %u\n", syscall(SYS_gettid));  printf("child pthread_self= %u\n", (unsigned int)pthread_self());//printf("child thread tid = %u\n", pthread_self());
}int main()
{int iRet = 0;pthread_t pth1;printf("main gettid = %u\n", syscall(SYS_gettid));  printf("main pthread_self = %u\n", (unsigned int)pthread_self());  iRet =  pthread_create(&pth1, NULL, (void*)Func_pth1, NULL);if(iRet){printf("create pthread fail\n");}printf("---pthread_t = %u\n", (unsigned int)pth1);pthread_join(pth1, NULL);return 0;
}

运行结果:

main gettid = 5100
main pthread_self = 3078461120
---pthread_t = 3078458224
child gettid = 5101
child pthread_self= 3078458224

分析:

1 pthread_self()是POSIX的实现,它的返回值是pthread_t,pthread_t在linux中实际是无符号长整型,即unsigned long。gettid是系统调用,它的返回值是pid_t,在linux上是一个无符号整型。但glibc并没有实现该函数,只能通过Linux的系统调用syscall来获取。

2 pthread_self是为了区分同一进程中不同的线程, 是由thread的实现来决定的。pthread_self返回的是同一个进程中各个线程之间的标识号,对于这个进程内是唯一的,而不同进程中,每个线程返回的pthread_self可能返回的是一样的。而gettid获取的线程id和pid是有关系的,因为在linux中线程其实也是一个进程(clone),所以它的线程ID也是pid_t类型。在一个进程中,主线程的线程id和进程id是一样的,该进程中其他的线程id则在linux系统内是唯一的,gettid是不可移植的。

3  Linux中的POSIX线程库实现的线程其实也是一个进程(LWP),只是该进程与主进程(启动线程的进程)共享一些资源而已,比如代码段,数据段等。

有时候我们可能需要知道线程的真实pid。比如进程P1要向另外一个进程P2中的某个线程发送信号时,既不能使用P2的pid,更不能使用线程的pthread id,而只能使用该线程的真实pid,称为tid。

linux 线程创建 pthread_create函数 获取线程id相关推荐

  1. linux编程之pthread_create函数

    linux编程之pthread_create函数UNIX环境创建线程函数, 具体格式: #include<pthread.h> int pthread_create(pthread_t * ...

  2. Linux pthread_self和pthread_create函数

    pthread_self和pthread_create函数 头文件 #include <pthread.h> 函数原型 pthread_t pthread_self(void); int ...

  3. Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)

    对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...

  4. C语言多线程教程(pthread)(线程创建pthread_t,指定线程run方法pthread_create,加mutex锁,解锁,伪共享 false sharing【假共享】)

    [C语言]多线程程序入门教程 文章目录 查看pthread_create()函数文档 · Demo1 单线程(创建线程pthread_t .创建线程run方法pthread_create) · Dem ...

  5. 线程创建 pthread_create 中自定义参数注意事项

    2019独角兽企业重金招聘Python工程师标准>>> 1. 函数原型 int pthread_create(pthread_t *thread, const pthread_att ...

  6. C#多线程与UI响应 防止界面假死不响应(子线程创建的窗体获取消息响应用Application.DoEvent )

    一. 概述 在使用C#进行应用程序设计时,经常会采用多线程的方式进行一些后台任务的工作.对于不同的应用场景,使用的策略也不尽相同. 1. 后台循环任务,少量UI更新:例如批量上传文件,并提供进度.这种 ...

  7. 在微信公众平台上创建模版并获取模版 ID。 调用模版消息接口,发送模版消息。 代码如下:...

    好的,我会尽力帮你. 首先,要在微信公众平台上创建模板,你需要先登录你的微信公众平台账号,然后依次点击"消息推送"."模板消息"."添加模板" ...

  8. linux线程随笔-pthread_create函数

    函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t  *r ...

  9. Linux 如何创建进程函数与查看进程

    进程创建函数 进程就是pcb,意味着创建一个进程,就是创建一个pcb pid_t fork(void) –通过复制调用进程(父进程)创建一个新的进程(子进程) 创建一个新的pcb,然后从父进程pcb中 ...

最新文章

  1. pandas统计缺失值的个数
  2. java子网划分_子网划分讲解及练习(二)
  3. Keras版Sequence2Sequence对对联实战——自然语言处理技术
  4. 在 JavaScript 中创建 JSON 对象
  5. MySQL 面试必备 8 个知识点
  6. js apply/call/caller/callee/bind使用方法与区别分析
  7. sys.path.append 和 sys.path.insert辨析
  8. Xshell Xftp 免费版申请 官方正版 | 无需破解
  9. 2022华为杯 E 题 数学建模思路分享
  10. 计算机的键盘怎么找出来,电脑的键盘隐藏了怎么办
  11. 一只小野鸭的超能量(超有启发性)
  12. cmake简洁教程 - 第五篇
  13. java 307跳转_GitHub - yy307/java-weixinlib: 微信公众平台接入
  14. 尚医通(二十五)就医提醒和预约统计
  15. 农村将迎来重大爆发!传统农业链条正在重塑,关键一步已经迈出
  16. java 批次号,java重复批次执行
  17. 三国刘备十大名言:三分天下要靠“混
  18. 【JAVA项目实战】【图书管理系统】用户查询功能【Servlet】+【Jsp】+【Mysql】
  19. Como fazer uma要求GET de uma API REST em Java e转换器JSON em um objeto
  20. 【高数】高数第四章节——不定积分换元积分分部积分

热门文章

  1. (三)内核移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>
  2. python 中iloc_使用DataFrame存取器iloc[]
  3. 程序员的多种网赚创富方法
  4. linux命令chgrp,Linux命令Chgrp 详解
  5. 智能网联精准公交解决方案白皮书发布,希迪智驾与腾讯开启战略合作(附下载)...
  6. mysql ver 14.14下载_MySQL简介及安装 mysql Ver 14.14 Distrib 5.7.28
  7. 建群网培PMP每日一练2020-8-6
  8. MySQL时间格式化date_format
  9. 16进制颜色值 与 rgb颜色值转换
  10. 高性能msyql读书日志