多线程
来源:互联网 发布:阿里巴巴 借壳 数据港 编辑:程序博客网 时间:2024/06/16 07:55
多任务处理的两种类型
基于进程:程序的并发执行.简单说就是把一份代码复制成多份,并让它们同时执行。进程间通信就是为了让它们有序的运行。
基于线程:同一程序的片段的并发执行.简单说就是让多个函数同时执行,每个函数称为一个线程,线程定义了一个单独的执行路径。线程间通信是为了让它们有序的运行。
Pthread(POSIX threads)
Pthreads定义了一套C语言的类型、函数与常量,它以pthread.h头文件和一个线程库实现。
数据类型
- pthread_t:线程ID
- pthread_attr_t:线程属性
操纵函数
- 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(): 对两个线程的线程标识号进行比较
- pthread_detach(): 分离线程
- pthread_self(): 查询线程自身线程标识号
创建线程
- 头文件
#include <pthread.h>
- 函数声明
int pthread_create(pthread_t *tidp, const pthread_attr_t *attr,(void*)(*start_rtn)(void*), void *arg);
参数
tidp: 指向线程标识符的指针,线程创建成功时,tidp指向的内存单元被设置为新创建线程的线程ID。
attr: 设置线程属性。
(start_rtn)(void): 线程运行函数的起始地址。
arg: 运行函数的参数。编译链接参数
- lpthread
- 返回值
线程创建成功,返回0。
线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。
返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
终止线程
#include<pthread.h>pthread_exit(status);
pthread_exit 用于显式地退出一个线程。通常情况下,pthread_exit() 函数是在线程完成工作后无需继续存在时被调用。
如果 main() 是在它所创建的线程之前结束,并通过 pthread_exit() 退出,那么其他线程将继续执行。否则,它们将在 main() 结束时自动被终止。
连接和分离线程
我们可以使用以下两个函数来连接或分离线程:
pthread_join (threadid, status) pthread_detach (threadid)
pthread_join() 子程序阻碍调用程序,直到指定的 threadid 线程终止为止。当创建一个线程时,它的某个属性会定义它是否是可连接的(joinable)或可分离的(detached)。只有创建时定义为可连接的线程才可以被连接。如果线程创建时被定义为可分离的,则它永远也不能被连接。
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- HTML之固定定位
- css transform制作三角图形
- VC 隐藏驱动器 -win7下测试可用
- 1.偏头痛杨的rocketmq4.x入门之基础概念扫盲篇
- Oracle数据移动-导入和导出
- 多线程
- [lcm] MTK平台移植屏幕lcd过程要点
- IntelliJ IDEA 2016.2 配置Tomcat 运行Web项目
- pgpool(3.6.5)的一个巨坑
- handlebars获取json对象(单个Javabean对象)
- Spring Quartz 定时器源码和配置文件
- 富文本编辑器中的敏感词替换
- 前端框架vue.js系列(5):表单
- IntelliJ IDEA 配置Gradle运行SpringBoot Web项目(tomcat容器)