pthread

  • 作用
  • pthread_join
  • pthread_exit

作用

线程库实行了POSIX线程标准通常称为Pthreads。POSIX线程具有很好的可移植性,使用pthreads编写的代码可运行于Solaris、FreeBSD、Linux 等平台,Windows平台亦有pthreads-win32可供使用。

Pthreads定义了一套C语言的类型、函数与常量,它以pthread.h头文件和一个线程库实现。

数据类型
pthread_t:线程ID(线程标识符,用于声明线程ID)
pthread_attr_t:线程属性
1

操纵函数
pthread_create():创建一个线程
pthread_exit():终止当前线程
pthread_cancel():中断另外一个线程的运行
pthread_join():阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init():初始化线程的属性
pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
pthread_attr_getdetachstate():获取脱离状态的属性
pthread_attr_destroy():删除线程的属性
pthread_kill():向线程发送一个信号

同步函数
用于 mutex 和条件变量
pthread_mutex_init() 初始化互斥锁
pthread_mutex_destroy() 删除互斥锁
pthread_mutex_lock():占有互斥锁(阻塞操作)
pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
pthread_mutex_unlock(): 释放互斥锁
pthread_cond_init():初始化条件变量
pthread_cond_destroy():销毁条件变量
pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
pthread_cond_wait(): 等待条件变量的特殊条件发生
Thread-local storage(或者以Pthreads术语,称作线程特有数据):
pthread_key_create(): 分配用于标识进程中线程特定数据的键
pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
pthread_key_delete(): 销毁现有线程特定数据键
pthread_attr_getschedparam();获取线程优先级
pthread_attr_setschedparam();设置线程优先级

工具函数
pthread_equal(): 对两个线程的线程标识号进行比较
(int pthread_equal ( pthread_t t1 , pthread_t t2); 比较两个线程ID是否相同)
pthread_detach(): 分离线程
pthread_self(): 查询线程自身线程标识号

(pthread_t pthread_self( void ); 获取自身线程ID)

例子:int pthread_create ( pthread_t *thread , const pthread_attr_t *attr , void *(start)(void) , void *arg );

  1. 执行pthread_create,将创建线程,成功则返回0,否则返回-1;
  2. 参数1返回一个绑定特定函数的线程ID;
  3. 参数2为线程属性对象指针,用来改变线程的属性;
  4. 参数3为线程运行的函数指针,被调用的函数必须返回空指针,且只能有一个空指针参数;
  5. 参数4为传递给被调用函数的参数;

以下为主线程中使用两个子线程的例子:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>using namespace std;void *myThreadID1(void*)
{cout<<"thread_ID1"<<"\n";
}void *myThreadID2(void*)
{cout<<"thread_ID2"<<"\n";
}int main()
{int i =0 ,ret = 0;pthread_t id1,id2;//声明线程IDret = pthread_create(&id1 , NULL ,  myThreadID1, NULL); //创建并执行线程id1if(ret == -1){printf("Create pthread error!\n");return 1;}ret = pthread_create(&id2 , NULL ,  myThreadID2, NULL); //创建并执行线程id2if(ret == -1){printf("Create pthread error!\n");return 1;}pthread_join( id1 , NULL );  //阻塞主线程,直到id1结束才接触,pthread_join( id2 , NULL );cout<<"all thread done!";return 0;
}

pthread_join

函数pthread_join用来等待一个线程的结束,线程间同步的操作。头文件 : #include <pthread.h>
函数定义: int pthread_join(pthread_t thread, void **retval);
描述 :pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。pthread_join用于等待一个线程的结束,也就是主线程中要是加了这段代码,就会在加代码的位置卡主,直到这个线程执行完毕才往下走。
参数 :thread: 线程标识符,即线程ID,标识唯一线程。retval: 用户定义的指针,用来存储被等待线程的返回值。
返回值 : 0代表成功。 失败,返回的则是错误号。

pthread_exit

线程通过调用pthread_exit函数终止执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。
功能:使用函数pthread_exit退出线程,这是线程的主动行为;由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,但是可以用pthread_join()函数来同步并释放资源。
pthread_exit用于强制退出一个线程(非执行完毕退出),一般用于线程内部。
说明:retval:pthread_exit()调用线程的返回值,可由其他函数如pthread_join来检索获取。2


  1. [link](https://baike.sogou.com/v10119989.htm?fromTitle=pthread_attr_t ). ↩︎

  2. pthread_join\pthread_exit 联系与区别(https://blog.csdn.net/androidbbc/article/details/51479682)
    (pthread_join: https://blog.csdn.net/dinghqalex/article/details/42921931 ) ↩︎

pthread使用方法相关推荐

  1. iOS多线程:『pthread、NSThread』详尽总结

    2019独角兽企业重金招聘Python工程师标准>>> 本文用来介绍 iOS 多线程中,pthread.NSThread 的使用方法及实现. 第一部分:pthread 的使用.其他相 ...

  2. std::thread与pthread

    线程std::thread与pthread对比 多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程. 基于进程的多 ...

  3. 对条件变量(condition variable)的讨论

    作者:王东 1.1       什么是条件变量和条件等待? 简单的说: 条件变量(condition variable)是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待某个 ...

  4. 搭建 bochs 运行环境

    本文转载自 https://blog.csdn.net/YuDale/article/details/68500536?utm_source=copy 感谢作者的分享 另外我亲自试过文中的操作 如果问 ...

  5. bochs linux 安装软件,Centos 下安装 Bochs

    下载Bochs 找一个Bochs最新的下载就好了 yum install gcc bochs使用c++编写,编译源代码时用到gcc yum groupinstall "Development ...

  6. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  7. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  8. Pthread多线程编程之查看Pthread版本的方法

    Pthread多线程编程之查看Pthread版本的方法: getconf GNU_LIBPTHREAD_VERSION [root@localhost Workspace]# getconf GNU_ ...

  9. 随想录(关于pthread的使用方法)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] linux下面由多进程和多线程两种编程方法.多进程比较健壮,但是数据通讯比较麻烦.多线程使用上更 ...

最新文章

  1. 网页设计和用户界面设计
  2. QIIME 2教程. 13训练特征分类器Training feature classifiers(2020.11)
  3. 全球及中国印刷行业发展形势与十四五应用前景分析报告2022版
  4. 使用Amoeba实现MySQL读写分离详细步骤(推荐的方式)
  5. php多分支结构 案例,第4天 PHP分支、循环结构
  6. linux 提交git,linux下git使用记录1 git 提交
  7. display:table-cell的集中应用
  8. 第5次基金申请终于中了!这个血泪教训一定要避免
  9. 谁能救得了中兴?下一个是华为吗?
  10. java连接ldap验证,验证用户使用LDAP登录
  11. 父级透明,子级不透明
  12. oracle解析关闭,oracle起动和关闭详解(转)
  13. java语言难度最大的地方_学习难度最高的五大编程语言
  14. 启用计算机的无线同屏,win10系统无线同屏功能如何使用
  15. 8月AppStore最新社交App排名:soul第一,觅伊第十
  16. 人工智能和人类智能的本质区别是什么(一)
  17. 基于Kinect Azure的多相机数据采集(二)
  18. kettle调用免费天气接口API入库
  19. 用高斯约当法求逆矩阵​​​​​​​​​​​​​​​​​​​​​A-1
  20. Linux Ubuntu 虚拟机不能连网、Linux Ubuntu 虚拟机怎么连网

热门文章

  1. 详解缓存穿透、缓存雪崩、缓存击穿
  2. 基于C++MFC的活塞环外观表面缺陷机器视觉检测系统
  3. STM32定时器功能概括
  4. 动画基础2 -- 插值器与估值器
  5. Javascript中扩展运算符的作用及使用场景
  6. python中 map函数 的使用
  7. 实时更新天气微信小程序开发
  8. CCActionGird3D源码解析
  9. 全球4亿条用户电话号码曝光 Facebook再曝巨大安全漏洞
  10. Matlab中的数据分布KS检验