线程同步问题

多线程带来的问题#

同一进程的不同线程虽然有着不同的栈空间,但它们有可能会访问全局变量等数据。如果两个线程同时对某个共享数据进行读写操作,就很有可能产生不同步的问题。需要一些手段来实现线程之间的同步。

实现线程同步的方式#

互斥锁mutex#

mutex是一个互斥锁,同一时间,只有一个进程能够拿到特定的mutex。使用mutex可以保护unsafe region,保证同一时间内只有一个线程同时进入critical section。

信号量 semaphore#

信号量是由Dijkstra提出的,由系统内核实现的。0-1 信号量与mutex很像,但是实质上是有区别的。

The semaphore values are kept in a table stored in kernel memory.
A semaphore is identified by a number corresponding to a position
in this table.

There are system calls for creating or freeing semaphores, as well
as for executing the wait and signal operations. These operations
are executed in supervisor mode and hence atomically (interrupts
are disabled in supervisor mode).

P(s)操作

  • 如果s非零,则s=s-1并立即返回,这个测试和更新s的过程是原子操作,不可分割。
  • 如果s为0,则调用P(s)操作的线程被挂起,直到V操作发生时,才有可能被内核调度并restart。
  • restart后会P操作同样执行s=s-1并立即返回。

V(s)操作

  • 执行s=s+1,这个过程是原子操作。
  • 如果有线程因s=0而挂起,则从所有挂起的线程中选择一个restart,restart的线程会执行s=s-1。
int sem_init(sem_t *sem, int pshared, unsigned int value); //初始化信号量
int sem_wait(sem_t *sem); //P操作
int sem_post(sem_t *sem); //V操作

semaphore与mutex的区别#

0-1 semaphore能够实现与mutex相同的功能。但严格来说,mutex是一种用于同步对资源访问的锁定机制,而semaphore是一种信号机制。

作者:yuxiayizhengwan

出处:https://www.cnblogs.com/yuxiayizhengwan/p/16190547.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   雨下yi整晚  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示