pthread使用方法
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 );
- 执行pthread_create,将创建线程,成功则返回0,否则返回-1;
- 参数1返回一个绑定特定函数的线程ID;
- 参数2为线程属性对象指针,用来改变线程的属性;
- 参数3为线程运行的函数指针,被调用的函数必须返回空指针,且只能有一个空指针参数;
- 参数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
[link](https://baike.sogou.com/v10119989.htm?fromTitle=pthread_attr_t ). ↩︎
pthread_join\pthread_exit 联系与区别(https://blog.csdn.net/androidbbc/article/details/51479682)
(pthread_join: https://blog.csdn.net/dinghqalex/article/details/42921931 ) ↩︎
pthread使用方法相关推荐
- iOS多线程:『pthread、NSThread』详尽总结
2019独角兽企业重金招聘Python工程师标准>>> 本文用来介绍 iOS 多线程中,pthread.NSThread 的使用方法及实现. 第一部分:pthread 的使用.其他相 ...
- std::thread与pthread
线程std::thread与pthread对比 多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程. 基于进程的多 ...
- 对条件变量(condition variable)的讨论
作者:王东 1.1 什么是条件变量和条件等待? 简单的说: 条件变量(condition variable)是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待某个 ...
- 搭建 bochs 运行环境
本文转载自 https://blog.csdn.net/YuDale/article/details/68500536?utm_source=copy 感谢作者的分享 另外我亲自试过文中的操作 如果问 ...
- bochs linux 安装软件,Centos 下安装 Bochs
下载Bochs 找一个Bochs最新的下载就好了 yum install gcc bochs使用c++编写,编译源代码时用到gcc yum groupinstall "Development ...
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...
- Java面试题大全2021版
一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- Pthread多线程编程之查看Pthread版本的方法
Pthread多线程编程之查看Pthread版本的方法: getconf GNU_LIBPTHREAD_VERSION [root@localhost Workspace]# getconf GNU_ ...
- 随想录(关于pthread的使用方法)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] linux下面由多进程和多线程两种编程方法.多进程比较健壮,但是数据通讯比较麻烦.多线程使用上更 ...
最新文章
- 网页设计和用户界面设计
- QIIME 2教程. 13训练特征分类器Training feature classifiers(2020.11)
- 全球及中国印刷行业发展形势与十四五应用前景分析报告2022版
- 使用Amoeba实现MySQL读写分离详细步骤(推荐的方式)
- php多分支结构 案例,第4天 PHP分支、循环结构
- linux 提交git,linux下git使用记录1 git 提交
- display:table-cell的集中应用
- 第5次基金申请终于中了!这个血泪教训一定要避免
- 谁能救得了中兴?下一个是华为吗?
- java连接ldap验证,验证用户使用LDAP登录
- 父级透明,子级不透明
- oracle解析关闭,oracle起动和关闭详解(转)
- java语言难度最大的地方_学习难度最高的五大编程语言
- 启用计算机的无线同屏,win10系统无线同屏功能如何使用
- 8月AppStore最新社交App排名:soul第一,觅伊第十
- 人工智能和人类智能的本质区别是什么(一)
- 基于Kinect Azure的多相机数据采集(二)
- kettle调用免费天气接口API入库
- 用高斯约当法求逆矩阵​​​​​​​​​​​​​​​​​​​​​A-1
- Linux Ubuntu 虚拟机不能连网、Linux Ubuntu 虚拟机怎么连网