向你的C语言项目中加入多线程
C语言在标准库<pthread.h>中为程序员提供了多线程操作接口。
先从简单操作入手
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *arg), void *arg)
线程创建
int pthread_join( pthread_t thread, void * * value_ptr )
线程等待
int pthread_detach(pthread_t thread)
线程分离
int pthread_exit(pthread_t th, void **thr_return)
线程结束
pthread_t
pthread_t是表示线程号的数据类型。它的出处是/usr/include/bits/pthreadtypes.h。
typedef unsigned long int pthread_t
pthread_create
线程创建函数,为新线程分配资源并且创建成功后线程即开始运行,新线程的线程号即传参进去的线程号。
通过第二个参数指定新线程的属性为“joinable”或“detached”,默认为joinable。若线程属性为joinable,则需要由其他线程调用pthread_join阻塞等待其结束并为之回收资源,不然就成了"僵尸线程";若线程属性为detached,则线程结束后自动回收所有资源。
- 参数说明
int pthread_create(pthread_t *thread, 目标线程的线程号
pthread_attr_t *attr, 设置线程的属性
void *(*start_routine) (void *arg), 目标函数的起始地址
void *arg) 目标函数的参数
- 返回值
如果线程创建成功,返回0; 如果线程创建失败,返回错误编号。
pthread_join
当调用pthread_join时,当前线程进入阻塞状态,等待被连接的线程运行结束返回,当前线程再转回运行状态。被连接的线程必须是非分离的。一个线程不能被多个线程等待。
- 参数说明
int pthread_join( pthread_t thread, 目标线程的线程号
void * * value_ptr ) 目标线程的返回值
- 返回值
成功则返回0; 失败则返回错误编号。
pthread_detach
将joinable的线程设置为detached的线程。这样该线程在运行结束后会自动回收其所有资源。
pthread_exit
调用pthread_exit可以显式地结束当前线程,传入的唯一的参数是线程的返回值。
掌握基本操作后开始学习新技能
互斥锁
//两种方法对锁进行初始化
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
//互斥锁的销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
//获得锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
//释放锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
条件变量
// 初始化条件变量
int pthread_cond_init(pthread_cond_t *cond,
pthread_condattr_t *cond_attr);
// 阻塞等待
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
// 超时等待
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,
const timespec *abstime);
// 解除所有线程的阻塞
int pthread_cond_destroy(pthread_cond_t *cond);
// 至少唤醒一个等待该条件的线程
int pthread_cond_signal(pthread_cond_t *cond);
// 唤醒等待该条件的所有线程
int pthread_cond_broadcast(pthread_cond_t *cond);
最新文章
- markdown博文测试
- java.util.concurrent包详细分析--转
- WPF Prism
- eclipse中如何关闭运行时自动保存?
- 用Wireshark简单分析HTTP通信
- [shell]. 点的含义
- PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量
- MapReduce 中的Map后,sort不能对中文的key排序
- php用户验证代码的简单例子
- 【Android】应用启动画面
- 最近新版本的pangolin出现了点问题,我把可用的旧版本上传到了github
- java基础(一):谈谈java内存管理与垃圾回收机制
- Node.js知识点总结
- U68464 滑稽树上滑稽果(guo)
- Math.round(),Math.ceil(),Math.floor()
- Swagger2 配置
- websocket activemq
- P1174 互素
- [linux] /sbin/nologin的用户运行程序
- Java遍历Map键、值。获取Map大小的方法
热门文章
- Elasticsearch第五篇:PlainElastic.Net 操作 Elasticsearch
- windows 下 安装 RabbitMQ
- Android ActivityResumeTrigger: not whiteListed
- Android 在代码中修改TextView的DrawableRight等方向上的图片
- unity探索者之微信分享所有流程,非第三方插件
- magento 2 cronjob setup
- java程序CPU 100%调试
- HDU 6609 离散化+权值线段树
- await,async 我要把它翻个底朝天,这回你总该明白了吧
- Javascript逻辑运算认识