当前位置: 首页 > news >正文

CentOS 使用线程库Pthread 库

1、Pthread 库说明

pthread 库是Linux系统默认线程库。

在Linux 系统环境中,编辑C/C++程序使用pthread 库,需要添加对应的头文件,并链接pthread库。

#include<pthread.h>

2、Pthread 库核心方法

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 内容是未定义的。

pthread_join

函数定义:

int pthread_join(pthread_t thread, void **retval);

参数说明: 

thread 是线程表示符

retval 用来获取线程的返回值,一般是 pthread_join 方法传递出来的值

功能说明:

这是一个线程阻塞函数,调用该函数则等到线程结束才继续运行

pthread_exit

函数定义:

void pthread_exit(void *retval);

参数说明: 

retval 是线程的退出码,传递给创建线程的地方

功能说明:

一个线程的结束有两种途径:

  • 线程函数体执行结束;
  • 调用 pthread_exit 方法退出线程;

pthread_self

函数定义:

pthread_t pthread_self();

功能说明:

用来获取当前线程ID

pthraad_detach

函数定义:

int pthread_detach (pthread_t __th)

功能说明:

分离线程

3、Pthread 库线程属性说明

线程属性 

设置线程不同属性有不同属性有不同的方法,但是都需要先初始化属性数据结构,初始化函数为:

int pthread_attr_init(pthread_attr_t *__attr);

线程属性包括:

  1. 作用域;
  2. 栈大小;
  3. 栈地址;
  4. 优先级;
  5. 分离状态;
  6. 调度策略;
  7. 调度参数;

 分离状态

线程终止时,系统将不再保留线程终止状态;当不需要线程的终止状态时,可以分离线程(调用 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,分别表示主线程阻塞和子线程剥离

线程优先级 

新线程的优先级默认为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);

继承父优先级 

新线程不继承父线程的调度优先级

调度策略

线程使用 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、Pthread 示例代码

前提:在/usr/local/source_code目录下新增thread_demo 目录,并在此目录下新建init_thread.cpp,文件内容如下:

#include <pthread.h>
#include <iostream>using namespace std;void* printHello(void* args) {cout << "Hello World from Thread" << endl;return NULL;
}int main() {pthread_t thread;if (pthread_create(&thread, NULL, &printHello, NULL)) {cout << "Error creating thread" << endl;return 1;}if (pthread_join(thread, NULL)) {cout << "Error joining thread" << endl;return 2;}return 0;
}

编译执行:

g++ init_thread.cpp -o init_thread  -L/usr/local/lib/ -lpthread

控制台输出:

[root@localhost thread_demo]# g++ init_thread.cpp -o init_thread  -L/usr/local/lib/ -lpthread
[root@localhost thread_demo]# ll
总用量 16
-rwxr-xr-x. 1 root root 9136 10月 24 14:44 init_thread
-rw-r--r--. 1 root root  459 10月 24 14:30 init_thread.cpp
[root@localhost thread_demo]# ./init_thread
Hello World from Thread

相关文章:

  • 【算法】滑动窗口题单——3.不定长滑动窗口(求最短/最小)⭐ 删除最短的子数组使剩余数组有序
  • unity button移动位置some values driven by canvas
  • Qt篇——子控件QLayoutItem与实际控件的强转
  • 网络通信 | 内网穿透
  • 2023年Flutter教程_Flutter+Getx仿小米商城项目实战视频教程-V3版
  • Flutter extended_image库设置内存缓存区大小与缓存图片数
  • 深入理解NLP
  • 基于单片机的空气质量检测系统
  • 接口测试 —— Requests库GET请求!
  • order by数据过多引起的cpu飙升
  • Web:探索 SpreadJS强大的在线电子表格库
  • 云原生之深入解析如何合并多个kubeconfig文件
  • Linux下protobuf和 protobuf-c安装使用
  • IP地址与代理ip在网络安全中的关键作用
  • Autojs 利用OpenCV识别棋子之天天象棋你马没了
  • [笔记] php常见简单功能及函数
  • Docker下部署自己的LNMP工作环境
  • node.js
  • npx命令介绍
  • Spring框架之我见(三)——IOC、AOP
  • uva 10370 Above Average
  • windows-nginx-https-本地配置
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 开源SQL-on-Hadoop系统一览
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 聊一聊前端的监控
  • 面试总结JavaScript篇
  • 判断客户端类型,Android,iOS,PC
  • 如何实现 font-size 的响应式
  • 深入 Nginx 之配置篇
  • 追踪解析 FutureTask 源码
  • zabbix3.2监控linux磁盘IO
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #git 撤消对文件的更改
  • $forceUpdate()函数
  • (2)nginx 安装、启停
  • (C++17) optional的使用
  • (C语言)fgets与fputs函数详解
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (LeetCode C++)盛最多水的容器
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (多级缓存)多级缓存
  • (十八)SpringBoot之发送QQ邮件
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .form文件_一篇文章学会文件上传
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /bin/bash^M: bad interpreter: No such file or directory
  • [.NET]桃源网络硬盘 v7.4
  • [100天算法】-不同路径 III(day 73)
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [2019/05/17]解决springboot测试List接口时JSON传参异常