pthread库的使用
1、说明
pthread 是Linux下的线程库。
2、使用
使用 pthread 需要添加头文件,并链接库 pthread
#include <pthread.h>
2.1、pthread_create
声明:
int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void*(*start_routine)(void*), void* arg);
参数:
pthread_t 定义如下:
typedef unsigned long int pthread_t;
thread 是一个指向线程标识符的指针,线程调用后,改值被设置为线程ID
attr 用来设置线程属性
start_routine 是线程函数的其实地址,即线程函数体,线程创建成功后,thread 指向的内存单元从该地址开始运行
arg 是传递给线程函数体的参数
返回值:
若线程创建成功,则返回0,失败则返回错误码,并且 thread 内容是未定义的。
2.2、pthread_join
声明:
int pthread_join(pthread_t thread, void **retval);
参数:
thread 是线程表示符
retval 用来获取线程的返回值,一般是 pthread_join 方法传递出来的值
说明:
这是一个线程阻塞函数,调用该函数则等到线程结束才继续运行
2.3、pthread_exit
声明:
void pthread_exit(void *retval);
参数:
retval 是线程的退出码,传递给创建线程的地方
说明:
一个线程的结束有两种途径:
- 线程函数体执行结束;
- 调用 pthread_exit 方法退出线程;
2.4、pthread_self
用来获取当前线程ID
声明:
pthread_t pthread_self();
2.5、pthraad_detach
分离线程
声明:
int pthread_detach (pthread_t __th)
3、线程属性
设置线程不同属相有不同属性有不同的方法,但是都需要先初始化属性数据结构,初始化函数为:
int pthread_attr_init(pthread_attr_t *__attr);
线程属性包括:
- 作用域;
- 栈大小;
- 栈地址;
- 优先级;
- 分离状态;
- 调度策略;
- 调度参数;
线程属性暂时不做深入研究
3.1、分离状态
线程终止时,系统将不再保留线程终止状态;当不需要线程的终止状态时,可以分离线程(调用 pthread_detach 函数),也可以通过设置线程的分离状态实现
int pthread_attr_getdetachstate(const pthread_attr_t* attr, int* state);
int pthread_attr_setdetachstate(pthread_attr_t* attr, int state);
state 的值可以是 PTHREAD_CREATE_DETACHED 和 PTHREAD_CREATE_JOINABLE,分别表示主线程阻塞和子线程剥离
3.2、线程优先级
新线程的优先级默认为0
int pthread_attr_getschedparam(const pthread_attr_t *restrict attr, struct sched_param *restrict param) ;
int pthread_attr_setschedparam(pthread_attr *restrict attr, const struct sched_param* restrict param);
3.3、继承父优先级
新线程不继承父线程的调度优先级
3.4、调度策略
线程使用 SCHED_OTHER 调度策略,线程一旦开始运行,直到被强占或者直到线程阻塞或者停止位置
int pthread_attr_setschedpolicy(pthread_attr_t* attr, int policy);
int pthread_attr_setschedparam(pthread_attr_t* attr, struct sched_param* param)
4、代码示例
#include <iostream>
#include <pthread.h>
#include <unistd.h>
void *thread(void *arg){
printf("thread id: %ld\n", pthread_self());
int value = *(int *)arg;
for (int index = 0; index < value; index++){
printf("thread, arg, %d\n", index);
sleep(1);
}
long res = 9;
pthread_exit((void*)res);
return arg;
}
int main(){
void* res = 0;
int value = 5;
//设置线程属性
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//线程分离
pthread_t handle;
pthread_create(&handle, &attr, thread, &value);
//pthread_create(&handle, NULL, thread, &value);
// pthread_detach(handle);//线程剥离
pthread_join(handle, &res);//join阻塞
printf("------end------,res: %ld\n", (long)res);//线程中传出的9
return 0;
}
pthread库的使用的更多相关文章
- VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程 转载
VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程 转载 #include <stdio.h>#include &l ...
- pthread库实现一个简单的任务池
pthread库实现一个简单的任务池 类关系图: 说明: 1:TaskManager类管理Task类,Task类是一个纯虚类; 2:ThreadManager类管理Th ...
- Linux下c++使用pthread库
pthread 库是纯c库,没有类指针的概念,当想phread_create中传递类成员函数时,就会报错,这里针对这种情况,对线程创建做了必要封装,较为简单,继承类,实现run接口,然后使用start ...
- 在windows下codeblocks中配置pthread库
转自:http://blog.csdn.net/u013172314/article/details/50846198 如果添加方法不正确,可能会出现pthread_create’未定义的引用,所以下 ...
- C语言多线程pthread库相关函数说明
线程相关操作说明 一 pthread_t pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义: typedef unsigned long int pth ...
- 查询pthread库的函数
首先需要先安装pthread看的手册文档,然后用如下命令查询: man -k pthread
- ubuntu 下没有pthread库以及报undefined reference to 'pthread_create'的解决方法
https://blog.csdn.net/dyzhen/article/details/79058554
- 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解
Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解 多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...
- Linux posix线程库总结
由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...
- zookeeper 的多线程和单线程库使用对比
zookeeper提供了两个库,zookeeper_st和 zookeeper_mt. 前者是单线程库,仅仅提供了异步API和集成在应用程序实现循环中的回调函数,这个库是为了支持pthread库不支持 ...
随机推荐
- AtCoder Beginner Contest 208 A~E个人题解
比赛链接:Here A - Rolling Dice 水题 一个六面的骰子,请问摇动 \(A\) 次最后的点数和能否为 \(B\) 如果 \(B \in [a,6a]\) 输出 YES C++ voi ...
- 数字孪生 3D 风电场,智慧风电之海上风电
前言 截止 2021 年,全球已有 127 个国家做出了"碳中和"的承诺,能源低碳转型和实现碳中和已经成为全球共同的战略目标.根据权威机构预测,到 2050 年,可再生能源发电将占 ...
- 12、SpringBoot-mybatis-plus-ehcache
系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...
- 【调试】GDB使用总结
启动 在shell下敲gdb命令即可启动gdb,启动后会显示下述信息,出现gdb提示符. ➜ example gdb GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1 Cop ...
- vue prop 会接收不同的数据类型
refAge: { type: Number, default: 0 }, refName: { type: String, default: '' }, hotDataLoading: { type ...
- Linux 中常见目录的作用
by emanjusaka from https://www.emanjusaka.top/2024/01/linux-directory-role 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下 ...
- Scan Synthesis Review
Review scan replacement - 将normal DFF替换为mux gate DFF scan stitching - 将DFF连接起来 scan的作用:将测试困难的时序逻辑转变为 ...
- [转帖]【SQL Server】varchar和nvarchar的基本介绍及其区别
https://www.cnblogs.com/zhaoyl9/p/15243556.html varchar(n) 长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 ...
- [转帖]SQLServer的UTF8支持
排序规则和 Unicode 支持 - SQL Server | Microsoft Learn UTF-8 支持 SQL Server 2019 (15.x) 完全支持广泛使用的 UTF-8 字符编码 ...
- [转帖]一文理清 TiDB 与 MySQL 中的常用字符集及排序规则
https://tidb.net/blog/0c5b6025 1.1. 字符集与编码规则 字符集(character set)即为众多字符的集合.字符集为每个字符分配一个唯一的 ID,称为 &qu ...