向你的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);
向你的C语言项目中加入多线程的更多相关文章
- Go语言项目中使用zap日志库(翻译)
本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...
- 在Go语言项目中使用Zap日志库
在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...
- C 语言项目中.h文件和.c文件的关系
http://blog.csdn.net/xingkong_678/article/details/38639847 关于两者以前的关系,要从N年以前说起了~ long long ago,once a ...
- Go语言项目的错误和异常管理 via 达达
Go语言项目的错误和异常管理 最近连续遇到朋友问我项目里错误和异常管理的事情,之前也多次跟团队强调过错误和异常管理的一些概念,所以趁今天有动力就赶紧写一篇Go语言项目错误和异常管理的经验分享. 首先我 ...
- TIA Portal V13 WinCC中创建多语言项目
1. 在项目树下选择“语言和资源”,双击打开“项目语言”,设置编辑语言和参考语言. 2. 在项目语言栏中勾选项目所需要的多种语言,我们以选择德语.英语和中文为例 3. 点击“参考语言”,切换语言为英语 ...
- 在Windows Phone项目中调用C语言DLL
在Windows Phone项目中调用C语言写的DLL 最近接到一个需求,需要在WP里调用一个C语言写的DLL,并且说Android和iOS都可以,问我WP是否可以这样? 我说我调研一下,就有了下面的 ...
- vue-i18n vue-cli项目中实现国际化 多语言切换功能 一
vue-cli项目中引入vue-i18n 安装: npm install vue-i18n可参考vue-i18n官网文档 main.js中引入: import Vue from 'vue' impor ...
- Go1.13 标准库的 http 包爆出重大 bug,你的项目中招了吗? 原创: 王亚楼 Go语言中文网 今天
Go1.13 标准库的 http 包爆出重大 bug,你的项目中招了吗? 原创: 王亚楼 Go语言中文网 今天
- (42)嵌入式项目中常用到的C语言技能总结
嵌入式项目中常用到的C语言技能 1.指针 .结构体. 枚举. 联合.数组.字符串.链表七个专题 2.结构体指针.结构体的多重嵌套[结构体中嵌套结构体.结构体中嵌套枚举.联合体.结构体中嵌套函数指针.一 ...
随机推荐
- Linux学习笔记 一 第二章 Linux系统安装
Linux系统安装 一.首先安装VMware 虚拟机 下载网址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-e ...
- 第2章 RDD编程(2.3)
第2章 RDD编程(2.3) 2.3 TransFormation 基本RDD Pair类型RDD (伪集合操作 交.并.补.笛卡尔积都支持) 2.3.1 map(func) 返回一个新的RDD,该 ...
- linux 查找删除
find -name "*.php" -exec rm -f '{}' \;
- 仿京东BOE官网图片链接
- 第一篇scrum冲刺博客--Interesting-Corps
第一篇scrum冲刺博客 一.Alpha阶段各成员任务 鲍鱼铭 任务名称 预计时间 主页页面和探测空间设计及布局实现 6h 主页页面跳转社区功能及社区设计及布局实现 6h 搜索页面跳转.设计及布局实现 ...
- 访问github太慢?我写了一个开源小工具一键变快
前言 GitHub应该是广大开发者最常去的站点,这里面有大量的优秀项目,是广大开发者寻找资源,交友学习的好地方.尤其是前段时间GitHub公布了一项代码存档计划--Arctic Code Vault, ...
- ZK的watch机制
1.watcher原理框架 由图看出,zk的watcher由客户端,客户端WatchManager,zk服务器组成.整个过程涉及了消息通信及数据存储. zk客户端向zk服务器注册watcher的同时, ...
- ssm-springboot实现修排名再顺序排的主要代码
排序改为2,结果如下: package com.zhetang.controller; import com.core.vo.JsonResult; import com.utils.PageResu ...
- SEO诊断方案以及执行方案
http://www.wocaoseo.com/thread-127-1-1.html 今天和大家一起讨论一下SEO诊断方案以及SEO执行方案要怎么写,主要从哪些方面进行呢,做SEO的朋友们一直在探讨 ...
- Python 3.10 明年发布,看看都有哪些新特性?
我们目前生活在Python 3.8的稳定时代,上周发布了Python的最新稳定版本3.8.4.Python 3.9已经处于其开发的beta阶段,并且2020年7月3日预发布了beta版本(3.9.0b ...