线程条件控制实现线程的同步
与条件变量相关API
条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。
条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。
条件变量使用之前必须首先初始化,pthread_cond_t数据类型代表的条件变量可以用两种方式进行初始化,可以把常量 PTHREAD_COND_INITIALIZER赋给静态分配的条件变量,但是如果条件变量是动态分配的,可以使用pthread_cond_destroy函数对条件变量进行去除初始化(deinitialize)。
1. 创建及销毁条件变量
#include <pthread.h>
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t*restrict cond);
// 返回:若成功返回0,否则返回错误编号
除非需要创建一个非默认属性的条件变量,否则pthread_cont_init函数的attr参数可以设置为NULL。cond参数是条件也要进行定义和初始化
2. 等待
#include <pthread.h>
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);//这个是立即返回
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, cond struct timespec *restrict timeout);//这个是等待一段时间后返回
// 返回:若成功返回0,否则返回错误编号
pthread_cond_wait等待条件变为真。如果在给定的时间内条件不能满足,那么会生成一个代表一个出错码的返回变量。传递给pthread_cond_wait的互斥量对条件进行保护,调用者把锁住的互斥量传给函数。函数把调用线程放到等待条件的线程列表上,然后对互斥量解锁,这两个操作都是原子操作。这样就关闭了条件检查和线程进入休眠状态等待条件改变这两个操作之间的时间通道,这样线程就不会错过条件的任何变化。pthread_cond_wait返回时,互斥量再次被锁住。
pthread_cond_timedwait函数的工作方式与pthread_cond_wait函数类似,只是多了一个timeout。timeout指定了等待的时间,它是通过timespec结构指定。
3. 触发
#include <pthread.h>
int pthread_cond_signal(pthread_cond_t*restrict cond);
int pthread_cond_broadcast(pthread_cond_t *restrict cond);
// 返回:若成功返回0,否则返回错误编号
这两个函数可以用于通知线程条件已经满足。pthread_cond_signal函数将唤醒等待该条件的某个线程,而pthread_cond_broadcast函数将唤醒等待该条件的所有进程。
注意一定要在改变条件状态以后再给线程发信号。
代码示例
#include<stdio.h>
#include<pthread.h>
#include <stdlib.h>
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);int g_data=0;//pthread_mutex_t mutex;
pthread_cond_t cond;void*func1(void *arg)
{static cnt=0;printf("t1 :%ld thread is created\n",(unsigned long)pthread_self());printf("t1:param is %d\n",*((int*)arg));while(1){pthread_cond_wait(&cond,&mutex);printf("t1 over==============================\n");printf("t1 :%d\n",g_data);g_data=0;sleep(1);if(cnt++==10){exit(1);}}}void*func2(void *arg)
{printf("t2 :%ld thread is created\n",(unsigned long)pthread_self());
printf("t2:param is %d\n",*((int*)arg));while(1){printf("t2 printf is %d\n",g_data);pthread_mutex_lock(&mutex);g_data++;if(g_data==3){pthread_cond_signal(&cond);}pthread_mutex_unlock(&mutex);sleep(1);}pthread_mutex_unlock(&mutex);
}int main()
{int ret;int param=100;pthread_t t1;pthread_t t2;pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond,NULL);ret=pthread_create(&t1,NULL,func1,(void*)¶m);if(ret==0){// printf("main:create t1 success\n");}ret=pthread_create(&t2,NULL,func2,(void*)¶m);if(ret==0){
// printf("main:create t2 success\n");}
// printf("main : %ld \n",(unsigned long)pthread_self());pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}
//其中func1中的cnt是测试用的
以下代码可以用试:
CLC@Embed_Learn:~/xiancheng$ gcc demo8.c -lpthread -odemo8
CLC@Embed_Learn:~/xiancheng$ vi text1.c
CLC@Embed_Learn:~/xiancheng$ ./a.out 10 >>test.ret.txt &(其中>>表示将运行的结果追加到test.ret.txt中 &表示在后台运行)
[1] 21313(这是进程的ID号)
初始化
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
//静态初始化
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
//动态初始化
参考博文:https://www.cnblogs.com/xiehongfeng100/p/4620852.html
线程条件控制实现线程的同步相关推荐
- Linux线程条件控制实现线程的同步pthread_cond_init、pthread_cond_destroy、pthread_cond_wait、pthread_cond_signal
目录 1.什么是条件变量 2.条件变量相关的API (1)创建条件变量 (2)pthread_cond_init()___初始化条件变量 (3)pthread_cond_destroy()___销毁条 ...
- 网络编程9_线程-条件,定时器,队列,线程池, 协程
线程 一. 条件 使得线程等待,只有满足某条件时,才释放n个线程 import time from threading import Thread,RLock,Conditio ...
- Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)
对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...
- Java20-day11【实现多线程(进程、线程-调度-控制-生命周期)、线程同步(同步代码块、线程安全、Lock)、生产者消费者(模式概述、案例)】
视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...
- java线程条件变量_多线程同步条件变量(转载)
最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...
- 条件变量实现线程同步
(1) 什么是条件变量实现线程同步? 假如我们的程序中有两个线程,一个是生产者线程,另一个是消费者线程,生产者线程每隔一段时间把数据写入到缓冲区buffer中,而消费者线程则每隔一段时间从buffer ...
- educoder 使用线程锁(lock)实现线程同步_性能:Lock的锁之优化
Lock / synchronized Lock锁的基本操作是通过乐观锁实现的,由于Lock锁也会在阻塞时被挂起,依然属于悲观锁 synchronizedLock实现方式JVM层实现Java底层代码实 ...
- java 线程 状态 图_Java线程中的生命周期和状态控制图文详解
这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...
- Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信
为什么80%的码农都做不了架构师?>>> Lock(锁)&Condition(条件)实现线程同步通信 接下来介绍,java5线程并发库里面的锁.跟锁有关的类和接口主要是 ...
最新文章
- MySQL-Front,MySQL的企业管理器
- java maven centos7 yum安装
- [Python设计模式] 第8章 学习雷锋好榜样——工厂方法模式
- MyEclipes 2016 CI 6 安装
- Spring Boot读取peoperties配置及@Value和@ConfigurationProperties区别和联系
- get 与 post的区别?application json 与form表单的区别?
- 【函数计算月报】2018年12月刊
- python file tell_Python3 File tell() 方法
- shell脚本攻略学习笔记(一)小试牛刀
- VC被控制时关闭极域电子教室、破解联想硬盘保护系统密码(上)
- java连接HDFS+Kerberos配置参数示例
- 135端口入侵教程(仅学习用)
- 正则表达式(判断中文,判断英文字母、下划线、数字)
- 如何在一只股票坐庄散户敢死队点评
- CSR8670蓝牙模块BQB认证经验总结
- hashMap的遍历方式
- 学习Linux命令:关于ssh命令
- 基于springboot的疫情防控系统
- STM32学习记录:输入捕获应用
- python文件夹在哪_Python文件夹与文件的相关操作(推荐)
热门文章
- Pytorch基础(六)——激活函数
- android 6关闭防火墙,安卓手机如何关闭防火墙
- linux c++ 获取时间,详解Linux下的C++时间类型:time_t
- 熟悉linux系统内核,[科普] Linux 的内核与 Linux 系统之间的关系
- 雨棚板弹性法计算简图_钢结构工程量计算、报价要点
- 面试题之--实现取余
- 【JZOJ3598】【CQOI2014】数三角形
- Asp.net Vnext IValueProvider
- 获取网址中参数的方式
- 跨域(三)——JSONP