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 是线程的退出码,传递给创建线程的地方

说明:

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

  1. 线程函数体执行结束;
  2. 调用 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);

线程属性包括:

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

线程属性暂时不做深入研究

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_DETACHEDPTHREAD_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库的使用的更多相关文章

  1. 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 ...

  2. pthread库实现一个简单的任务池

    pthread库实现一个简单的任务池 类关系图: 说明:         1:TaskManager类管理Task类,Task类是一个纯虚类;         2:ThreadManager类管理Th ...

  3. Linux下c++使用pthread库

    pthread 库是纯c库,没有类指针的概念,当想phread_create中传递类成员函数时,就会报错,这里针对这种情况,对线程创建做了必要封装,较为简单,继承类,实现run接口,然后使用start ...

  4. 在windows下codeblocks中配置pthread库

    转自:http://blog.csdn.net/u013172314/article/details/50846198 如果添加方法不正确,可能会出现pthread_create’未定义的引用,所以下 ...

  5. C语言多线程pthread库相关函数说明

    线程相关操作说明 一 pthread_t pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义: typedef unsigned long int pth ...

  6. 查询pthread库的函数

    首先需要先安装pthread看的手册文档,然后用如下命令查询: man -k pthread

  7. ubuntu 下没有pthread库以及报undefined reference to 'pthread_create'的解决方法

    https://blog.csdn.net/dyzhen/article/details/79058554

  8. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  9. Linux posix线程库总结

    由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...

  10. zookeeper 的多线程和单线程库使用对比

    zookeeper提供了两个库,zookeeper_st和 zookeeper_mt. 前者是单线程库,仅仅提供了异步API和集成在应用程序实现循环中的回调函数,这个库是为了支持pthread库不支持 ...

随机推荐

  1. 为什么很多候选人投出去的简历石沉大海(面向Java方向)

    我最近在帮上海某培训学校里的毕业生做面试辅导,普遍发现很多候选人不是没能力,或者说能力没有差到没有面试机会的程度,但这些同学投出去的简历大多石沉大海,即使有回应,也大多是些外包外派公司或者小公司. 而 ...

  2. S3C2440移植linux3.4.2内核之修改分区以及制作根文件系统

    上一节S3C2440移植linux3.4.2内核之内核框架介绍及简单修改我们简单配置了内核,这节来根据继续修改内核. 启动内核   内核启动的打印信息如下图所示   可以看到内核有8个分区,而我们的u ...

  3. Jenkins安装完成后,一直停留在页面Please wait while Jenkins is getting ready to work...的解决方法

    一.打开jenkins一直显示如下页面:

  4. java基础(15)--多态

    一.多态的含义 1.多种形态.多种状态,指的是编译与运行有不同的状态 2.编译时->静态绑定 3.执行时->动态绑定 4.多类典型场景:父类的引用指向了子类型的对象   二.向下转型与向上 ...

  5. Clickhouse执行处理查询语句(包括DDL,DML)的过程

    Clickhouse执行处理查询语句(包括DDL,DML)的过程 总体过程 启动线程处理客户端接入的TCP连接: 接收请求数据,交给函数executeQueryImpl()处理: executeQue ...

  6. C#对象二进制序列化优化:位域技术实现极限压缩

    目录 1. 引言 2. 优化过程 2.1. 进程对象定义与初步分析 2.2. 排除Json序列化 2.3. 使用BinaryWriter进行二进制序列化 2.4. 数据类型调整 2.5. 再次数据类型 ...

  7. 应用程序使用统计信息 – .NET CORE(C#) WPF界面设计

    应用程序使用统计信息 - .NET CORE(C#) WPF界面设计 首发文章地址:https://dotnet9.com/10546.html 关键功能点 抽屉式菜单 圆形进度条 Demo演示: 1 ...

  8. redis-持久化-RDB-AOF.png

  9. 【面试题精讲】如何使用Stream的聚合功能

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 求和(Sum): List<Integer ...

  10. 公司内部自建DNS的办法 使用私有域名的方法

    最近总是有一个需求,需要自己弄一些服务器域名之类的. 修改hosts总是比较麻烦,所以想了一个简单办法, 自己搭建一个dns服务器, 本来想用最简单的 dnsmasq 但是发现总是不成功, 然后找了另 ...