linux:线程同步的5种方法

  • 一.为什么要使用线程:
  • 二.线程同步的5种方法
    • 2.1 互斥量
    • 2.2 读写锁
    • 2.3 条件变量
    • 2.4 自旋锁
    • 2.5 屏障

一.为什么要使用线程:

<1>. 通过为每种事件类型分配单独的处理线程,可以简化处理异步事件的代码。每个线程在进行事件处理时可以采用同步编程模式,同步编程模式要比异步编程模式简单得多

<2>. 多个进程必须使用操作系统提供的复杂机制才能实现内存和文件描述符号的共享,而多个线程自动地可以访问相同的存储地址空间和文件描述符

<3>. 改善系统响应时间和吞吐量

二.线程同步的5种方法

2.1 互斥量

会阻塞/休眠的锁:
对互斥量进行加锁之后,任何试图再次对互斥量加锁的线程都会被阻塞,直到当前线程释放该互斥锁。

产生死锁的原因:
<1> 对于单个线程,试图获取自身已经持有的锁会造成死锁
<2>对于两个线程,各自持有对方需要的锁,并且都在请求对方的锁,从而陷入相互等待

如何避免死锁:
<1> 避免重复加锁
<1> 按顺序进行加锁

2.2 读写锁

读写锁也叫共享互斥锁,当读写锁是读模式锁住时,可以说它是共享的(所有试图以读模式对它进行加锁的线程都可以得到访问权)。读写锁是写模式锁住时,可以说它是互斥的(所有试图以写模式对它进行加锁的线程都被会阻塞)

2.3 条件变量

暂时无法理解,待日后更新。

2.4 自旋锁

自旋锁与互斥量类似,但它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(自旋)阻塞状态。一般用在以下情况:锁持有的时间短,而且线程并不希望在重新调度上花太多的成本。(ps:唤醒休眠线程并重新切换到运行态需要一定的时间开销)

2.5 屏障

屏障是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,直到所有的合作线程都达到某一个点,然后从该点继续执行。

参考:
<1>《Unix环境高级编程》
<2> Linux 线程同步的三种方法
<3> linux中实现线程同步的6种方法

linux:线程同步的5种方法相关推荐

  1. Linux 线程同步的三种方法

    程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同 ...

  2. C#线程同步的几种方法

    在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做 ...

  3. 归纳一下:C#线程同步的几种方法

    我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库或网络文件等.这些情况你都可以创建一个子线程 ...

  4. unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客

    unix c线程同步的三种方法:互斥量.读写锁以及条件变-xhb8413-ChinaUnix博客 unix c线程同步的三种方法:互斥量.读写锁以及条件变 2012-03-30 14:42:38 分类 ...

  5. C++中线程同步的四种方法(Win32平台)

    1.同步和互斥 互质是一种特殊的同步.线程同步一般指线程之间的执行存在某种程度上的相互依赖关系. 2.C++中线程同步的四种方法 (1)事件(Event); (2)信号量(semaphore); (3 ...

  6. linux中实现线程同步的6种方法

    linux线程同步的方法 下面是一个线程不安全的例子: #include<stdio.h> #include<pthread.h>int ticket_num=10000000 ...

  7. 15.线程同步的几种方法

    一.为什么需要线程同步 线程同步通常是出现在多线程环境下的问题,对于多个线程同时访问的共享内存中的变量,如果不进行保护,就会导致一些列数据出错问题.以下图为例: 假设线程A在第一次读取变量的值为10, ...

  8. 关于线程同步的几种方法

    java允许多线程,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突. 比方说,我们在买火车票的时候,如何能确定余票数据准确而无误差,这个时候就需要 ...

  9. java线程同步的7种方法

    为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),      将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有 ...

最新文章

  1. [密码学] DES(一)
  2. python3.6进度条_Python实现下载界面(带进度条,断点续传,多线程多任务下载等)...
  3. String.subString内存泄露
  4. matlab 滤掉高斯噪声吗,我想问一下:怎么用matlab编写函数对图像进行高斯滤波以去除噪声...
  5. ES6中的新特性:Iterables和iterators
  6. P5217 贫穷 平衡树
  7. 树莓派dht11 python_树莓派使用DHT11温湿度传感器
  8. 人民币数字金额转大写金额
  9. python-类的基本知识
  10. java基础—Objcet中的equals方法重写
  11. 别人家的地铁!长沙地铁全面进入5G时代 下载速率达1Gbps
  12. 【SpringMVC学习11】SpringMVC中的拦截器
  13. 关押罪犯 扩展域并查集
  14. 动态规划:leetcode 416 分割等和子集(背包问题应用)
  15. 学校与工作(献于在校大学生及入职不久的工作者)
  16. C++创建对象的三种方式
  17. NAND闪存(NAND Flash)颗粒SLC,MLC,TLC,QLC的对比
  18. https防流量劫持
  19. zz什么是beacons - 在Web Analytics中的应用(网站分析的灯塔)
  20. 2020 全国大学生数学建模竞赛 题目

热门文章

  1. mysqladmin的用法简介
  2. AACWallet 上线 小白也能一键发币啦
  3. 【观察】揭秘:中信银行信用卡新核心系统自研之路
  4. [读书笔记] Deep learning by Yann LeCun1,2, Yoshua Bengio3 Geoffrey Hinton4,5 on nature
  5. python 实时抓取网页数据并进行 筛查
  6. 阿里云添加管理员用户
  7. 盘古石杯全国电子数据取证大赛晋级赛wp(未完)
  8. 信息的可再生性举例_举例说说信息的可处理性
  9. win32-防火墙-禁用软件联网-详细教程
  10. 毕设必看——Python ttkbootstrap 制作账户注册信息界面