• 多线程同步的四种方式


    对于多线程程序来说,同步是指在一定的时间内只允许某一个线程来访问某个资源。而在此时间内,不允许其他的线程访问该资源。可以通过互斥锁(Mutex)、条件变量(condition variable)、读写锁(reader-writer lock)、信号量(semaphore)来同步资源。

     

    1. 互斥锁(Mutex)

    互斥量是最简单的同步机制,即互斥锁。多个进程(线程)均可以访问到一个互斥量,通过对互斥量加锁,从而来保护一个临界区,防止其它进程(线程)同时进入临界区,保护临界资源互斥访问。

    2. 条件变量(condition variable)

    条件变量适合多个进程(线程)等待同一事件发生,然后去干某事。举一个简单的例子:

    生产者和消费者模型:
    多个消费者去等待生产者生产物品,消费者去消耗物品。当生产者生产出来一件物品时,便可以通知所有的消费者(当然也可以只通知其中一个等待的消费者)---可以去消耗物品了。这时多个消费者便去争抢物品,谁快谁拿到物品消耗。当物品被消耗完时,消费者就等待生产者。就类似于这样的场景。
    条件变量必须配合互斥量一起工作。为什么?因为生产者生产出来的物品是临界资源,即所有进程和线程都可以使用的公共资源,则在一个时刻仅允许一个消费者去取。这时便使用互斥量去保护临界资源。

    3. 读写锁(reader-writer lock)

    读写锁适合于使用在读操作多,写操作少的情况,比如数据库。读写锁读锁可以同时加很多,但是写锁是互斥的。当有进程或者线程要写时,必须等待所有的读进程或者线程都释放自己的读锁方可以写。数据库很多时候可能只是做一些查询。

    4. 信号量(semaphore)

    在生产者消费者模型中,对任务数量的记录就可以使用信号量来做。可以理解为带计数的条件变量。当信号量的值小于0时,工作进程或者线程就会阻塞,等待物品到来。当生产者生产一个物品,会将信号量值加1操作。 这是会唤醒在信号量上阻塞的进程或者线程,它们去争抢物品。

     

    参考:

    链接:https://www.jianshu.com/p/eca71b7fda2c

  • 相关阅读:
    0180 定时器 之 setInterval() :开启定时器,京东倒计时案例,停止定时器,发送短信倒计时案例
    0179 定时器 之 setTimeout() :开启定时器,5秒后关闭广告案例,停止定时器
    json常用的注解
    Base64 编码与解码详解
    API 交互中怎么做好图片验证码?
    CSS中cursor 鼠标指针光标样式(形状)
    本地数据存储解决方案以及cookie的坑
    base64原理浅析
    Web前端十种常用的技术
    FreeMarker网页静态化
  • 原文地址:https://www.cnblogs.com/zkfopen/p/11232153.html
Copyright © 2020-2023  润新知