第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程序运行的效率低下,并不是我们期望的。

为了达到高效的操作,我们下面学习一下条件变量。

条件变量

初始化: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课-多线程同步相关推荐

  1. java里的多线程同步机制

    2019独角兽企业重金招聘Python工程师标准>>> 要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通 ...

  2. python多线程同步

    python多线程同步 作者:vpoet 日期:大约在夏季 1 import threading 2 import time 3 mylock = threading.RLock() 4 num=0 ...

  3. Thread 实现多线程同步下载网络图片(Java)

    Thread 实现多线程同步下载网络图片(Java) 1.自定义线程类继承Thread类 2.重写run()方法,编写线程执行体 3.创建线程对象,调用start()方法启动线程 4.Thread 实 ...

  4. Android工程师进阶第五课 多线程锁,线程池和DVM/ART优化

    第09讲:Java 线程优化 偏向锁,轻量级锁.重量级锁 我目前所在的公司是一家跨国企业,总部在瑞典.前段时间公司新开发的一个应用准备发布到应用宝平台.但是在发布之前,需要准备一系列软著相关的证明材料 ...

  5. java大厂技术面试第二课 多线程和锁

    第03讲:线程的状态有哪些?它是如何工作的? 线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在.一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此 ...

  6. Java第九课——多线程

    Java第九课--多线程 首先先了解一下什么是多线程: 多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率. 通俗的说就是在同一时间做多个任务,他们之间不能有 ...

  7. python 多线程同步锁之实现停车场业务(2)

    这边文章是实现同时有车辆出去,又有车辆进来的业务逻辑,和现实的差不多 真正要和现实中的一样,只需要更改休眠时间就可,通过调节修改时间,动态实现 之前的代码 python 多线程同步锁之实现停车场业务( ...

  8. Java多线程同步和通信

    多线程同步 回顾 1 进程:正在运行的程序,操作系统通过进程Id区分不同进程.2 线程:进程中的一条执行路径.一个进程中可以包含多个线程,至少有一个.3 区别:a.一个程序运行后至少有一个进程b.一个 ...

  9. python多线程读取文件的问题_Python多线程同步---文件读写控制方法

    1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res ...

  10. 【转】windows平台多线程同步之Mutex的应用

    线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量.   操作系统为每一个运行线程安排一定的CPU时间 -- 时间片.系统通过 ...

最新文章

  1. 算法练习----java字符全排列
  2. x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()
  3. 用python爬虫抓站的一些技巧总结
  4. 恢复联想键盘F1-F12标准模式
  5. python如何判断是否有弹出框_Selenium2+python自动化47-判断弹出框存在(alert_is_present)【转载】...
  6. 如何在命令行情重启计算机,如何应对“命令式”行情
  7. 13003.数据类型转换问题(python)
  8. 还在直接操作Redis?赶快来试试它....
  9. 图像处理之matlab中imnoise函数用法详解
  10. 计算机找不到ie浏览器,IE浏览器不见了怎么办?找回IE浏览器的方法
  11. python中align_Python pandas.DataFrame.align函数方法的使用
  12. 扇形涂色问题(Python)
  13. python爬取头条视频_Python爬虫:爬取某日头条某瓜视频,有/无水印两种方法
  14. apicloud mysql_apiCloud中的API对象
  15. php批量导入多个excel,php的excel数据批量导入
  16. 【day22】java导出word文档(包含导出图片)
  17. accumulate函数
  18. design pattern : Facade
  19. TCGA_改版后STAR-count处理方法
  20. 搜索功能(二)-搜索页面——搜索栏基本布局

热门文章

  1. 为何阿里开发手册中,线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
  2. Python爬虫基础-02-提取数据
  3. Flutter之Stack
  4. Android 滑动冲突问题的简单解决思路
  5. 安卓Timpicker样式修改、多版本适配、ScrollView滑动冲突
  6. 超级计算机燕 排名,特斯拉超级计算机算力全球第五,展现无人驾驶领域野心...
  7. 用计算机探索奥秘规律例题,计算器指法练习题.doc
  8. linux应用--yum
  9. 帆软层次坐标常用公式整理
  10. python安装mysql模块_Python:使用pip安装MySQL-python模块