第三季-第21课-多线程同步
第21课-多线程同步
21.1 线程同步
多个线程按照规定的顺序来执行,就是线程同步。
安排的情景:现在有A和B两个同学要打扫卫生。A同学要扫地,扫5次;B同学要擦地。我们知道肯定是要A同学先扫地才可以。
21.2 综合实例
1. 初始例程
sync.c
#include<pthread.h>
#include<stdio.h>
pthread_mutex_t mut;
int number = 0;
pthread_t thread[2];
void stduentA()
{
int i;
for(i=0;i<5;i++)
{
pthread_mutex_lock(&mut);
//扫1次地
number++;
if(number>=5)
{
printf("studentA has finished his work!\n");
}
pthread_mutex_unlock(&mut);
//休息1秒钟
sleep(1);
}
//退出
pthread_exit(NULL);
}
void stduentB()
{
while(1)
{
pthread_mutex_lock(&mut);
if(number>=5)//判断A同学是否扫完了5次地
{
//拖地
number = 0;
printf("studentB has finished his work!\n");
break;
}
else
{
pthread_mutex_unlock(&mut);
//睡眠2秒钟
sleep(2);
}
}
//退出
pthread_exit(NULL);
}
int main()
{
//初始化互斥锁
pthread_mutex_init(&mut, NULL);
//创建A同学线程
pthread_create(&thread[0], NULL, stduentA, NULL);
//创建B同学线程
pthread_create(&thread[1], NULL, stduentB, NULL);
//等待A线程结束
pthread_join(thread[0], NULL);
//等待B线程结束
pthread_join(thread[1], NULL);
}
运行结果:studentA has finished his work!
studentB has finished his work!
2. 改进例程
上面的程序虽然已经达成了我们期望的结果,但是StudenB程序运行的效率低下,并不是我们期望的。
为了达到高效的操作,我们下面学习一下条件变量。
l 条件变量
初始化:pthread_cond_t cond_ready=PTHREAD_COND_INITIALIZER;
等待条件成熟:pthread_cond_wait(&cond_ready,&mut);
设置条件成熟:pthread_cond_signal(&cond_ready);
l 条件变量的机制
我们之前的程序是先让A线程执行,B线程一直在查询成功的条件,而且要有休眠的体现,这一切的操作都是消耗CPU的。为了减少CPU的占用率,需要一种通知机制。在A线程运行的时候,B线程可以一直睡眠 。当A进程完成运行,呼叫B进程让B进程运行即可。
sync.c
#include<pthread.h>
#include<stdio.h>
pthread_mutex_t mut;
int number = 0;
pthread_t thread[2];
pthread_cond_t cond_ready=PTHREAD_COND_INITIALIZER; //设置机制
void stduentA()
{
int i;
for(i=0;i<5;i++)
{
pthread_mutex_lock(&mut);
//扫1次地
number++;
if(number>=5)
{
printf("studentA has finished his work!\n");
//通知B
pthread_cond_signal(&cond_ready);//成熟机制
}
pthread_mutex_unlock(&mut);
//休息1秒钟
sleep(1);
}
//退出
pthread_exit(NULL);
}
void stduentB()
{
pthread_mutex_lock(&mut);
if(number<5)//判断A同学是否扫完了5次地
pthread_cond_wait(&cond_ready,&mut); //等待休眠
number = 0;
pthread_mutex_unlock(&mut);
printf("studentB has finished his work!\n");
//退出
pthread_exit(NULL);
}
int main()
{
//初始化互斥锁
pthread_mutex_init(&mut, NULL);
//创建A同学线程
pthread_create(&thread[0], NULL, stduentA, NULL);
//创建B同学线程
pthread_create(&thread[1], NULL, stduentB, NULL);
//等待A线程结束
pthread_join(thread[0], NULL);
//等待B线程结束
pthread_join(thread[1], NULL);
}
运行结果:studentA has finished his work!
studentB has finished his work!
可以更快的显示!
转载于:https://www.cnblogs.com/free-1122/p/11352996.html
第三季-第21课-多线程同步相关推荐
- java里的多线程同步机制
2019独角兽企业重金招聘Python工程师标准>>> 要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通 ...
- python多线程同步
python多线程同步 作者:vpoet 日期:大约在夏季 1 import threading 2 import time 3 mylock = threading.RLock() 4 num=0 ...
- Thread 实现多线程同步下载网络图片(Java)
Thread 实现多线程同步下载网络图片(Java) 1.自定义线程类继承Thread类 2.重写run()方法,编写线程执行体 3.创建线程对象,调用start()方法启动线程 4.Thread 实 ...
- Android工程师进阶第五课 多线程锁,线程池和DVM/ART优化
第09讲:Java 线程优化 偏向锁,轻量级锁.重量级锁 我目前所在的公司是一家跨国企业,总部在瑞典.前段时间公司新开发的一个应用准备发布到应用宝平台.但是在发布之前,需要准备一系列软著相关的证明材料 ...
- java大厂技术面试第二课 多线程和锁
第03讲:线程的状态有哪些?它是如何工作的? 线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在.一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此 ...
- Java第九课——多线程
Java第九课--多线程 首先先了解一下什么是多线程: 多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率. 通俗的说就是在同一时间做多个任务,他们之间不能有 ...
- python 多线程同步锁之实现停车场业务(2)
这边文章是实现同时有车辆出去,又有车辆进来的业务逻辑,和现实的差不多 真正要和现实中的一样,只需要更改休眠时间就可,通过调节修改时间,动态实现 之前的代码 python 多线程同步锁之实现停车场业务( ...
- Java多线程同步和通信
多线程同步 回顾 1 进程:正在运行的程序,操作系统通过进程Id区分不同进程.2 线程:进程中的一条执行路径.一个进程中可以包含多个线程,至少有一个.3 区别:a.一个程序运行后至少有一个进程b.一个 ...
- python多线程读取文件的问题_Python多线程同步---文件读写控制方法
1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res ...
- 【转】windows平台多线程同步之Mutex的应用
线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量. 操作系统为每一个运行线程安排一定的CPU时间 -- 时间片.系统通过 ...
最新文章
- 算法练习----java字符全排列
- x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()
- 用python爬虫抓站的一些技巧总结
- 恢复联想键盘F1-F12标准模式
- python如何判断是否有弹出框_Selenium2+python自动化47-判断弹出框存在(alert_is_present)【转载】...
- 如何在命令行情重启计算机,如何应对“命令式”行情
- 13003.数据类型转换问题(python)
- 还在直接操作Redis?赶快来试试它....
- 图像处理之matlab中imnoise函数用法详解
- 计算机找不到ie浏览器,IE浏览器不见了怎么办?找回IE浏览器的方法
- python中align_Python pandas.DataFrame.align函数方法的使用
- 扇形涂色问题(Python)
- python爬取头条视频_Python爬虫:爬取某日头条某瓜视频,有/无水印两种方法
- apicloud mysql_apiCloud中的API对象
- php批量导入多个excel,php的excel数据批量导入
- 【day22】java导出word文档(包含导出图片)
- accumulate函数
- design pattern : Facade
- TCGA_改版后STAR-count处理方法
- 搜索功能(二)-搜索页面——搜索栏基本布局
热门文章
- 为何阿里开发手册中,线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
- Python爬虫基础-02-提取数据
- Flutter之Stack
- Android 滑动冲突问题的简单解决思路
- 安卓Timpicker样式修改、多版本适配、ScrollView滑动冲突
- 超级计算机燕 排名,特斯拉超级计算机算力全球第五,展现无人驾驶领域野心...
- 用计算机探索奥秘规律例题,计算器指法练习题.doc
- linux应用--yum
- 帆软层次坐标常用公式整理
- python安装mysql模块_Python:使用pip安装MySQL-python模块