Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 锁、互斥和信号量之间有什么区别?_Concurrency_Locking_Mutex_Semaphore - Fatal编程技术网

Concurrency 锁、互斥和信号量之间有什么区别?

Concurrency 锁、互斥和信号量之间有什么区别?,concurrency,locking,mutex,semaphore,Concurrency,Locking,Mutex,Semaphore,我听说过这些与并发编程有关的词,但是锁、互斥和信号量之间有什么区别呢?锁只允许一个线程进入被锁定的部分,并且锁不与任何其他进程共享 互斥锁与锁相同,但可以是系统范围的(由多个进程共享) A与互斥锁的作用相同,但允许x个线程进入,例如,这可用于限制同时运行的cpu、io或ram密集型任务的数量 有关互斥和信号量之间差异的更详细的帖子,请阅读 您还拥有读/写锁,在任何给定时间允许无限数量的读卡器或一个写卡器。锁只允许一个线程进入被锁定的部分,并且锁不会与任何其他进程共享 互斥锁与锁相同,但可以是系统

我听说过这些与并发编程有关的词,但是锁、互斥和信号量之间有什么区别呢?

锁只允许一个线程进入被锁定的部分,并且锁不与任何其他进程共享


互斥锁与锁相同,但可以是系统范围的(由多个进程共享)

A与互斥锁的作用相同,但允许x个线程进入,例如,这可用于限制同时运行的cpu、io或ram密集型任务的数量

有关互斥和信号量之间差异的更详细的帖子,请阅读


您还拥有读/写锁,在任何给定时间允许无限数量的读卡器或一个写卡器。

锁只允许一个线程进入被锁定的部分,并且锁不会与任何其他进程共享


互斥锁与锁相同,但可以是系统范围的(由多个进程共享)

A与互斥锁的作用相同,但允许x个线程进入,例如,这可用于限制同时运行的cpu、io或ram密集型任务的数量

有关互斥和信号量之间差异的更详细的帖子,请阅读


您还拥有读/写锁,在任何给定时间允许无限数量的读取器或一个写入器。

我的理解是,互斥锁只能在单个进程内使用,但可以跨多个线程使用,而信号量可以跨多个进程及其对应的线程集使用

此外,互斥锁是二进制的(它要么被锁定,要么被解锁),而信号量有计数的概念,或者是一个包含多个锁定和解锁请求的队列


有人能证实我的解释吗?我讲的是Linux,特别是Red Hat Enterprise Linux(RHEL)版本6,它使用内核2.6.32。

我的理解是,互斥锁只在单个进程内使用,但可以跨多个线程使用,而信号量可以跨多个进程及其对应的线程集使用

此外,互斥锁是二进制的(它要么被锁定,要么被解锁),而信号量有计数的概念,或者是一个包含多个锁定和解锁请求的队列

有人能证实我的解释吗?我讲的是Linux,特别是红帽企业Linux(RHEL)版本6,它使用内核2.6.32。

看看John Kopplin的文章

在线程间的同步部分,他解释了事件、锁、互斥、信号量和可等待计时器之间的区别

互斥锁一次只能由一个线程拥有,使线程能够 协调对共享资源的互斥访问

临界截面对象提供与此类似的同步 由互斥对象提供,但关键部分对象可以 仅由单个进程的线程使用

互斥临界区之间的另一个区别是 临界截面对象当前由另一个线程拥有,
EnterCriticalSection()
无限期地等待所有权,而 与互斥对象一起使用的WaitForSingleObject(),允许您 指定超时

信号量将计数保持在零和某个最大值之间, 限制同时访问数据库的线程数 共享资源

请看约翰·科普林的作品

在线程间的同步部分,他解释了事件、锁、互斥、信号量和可等待计时器之间的区别

互斥锁一次只能由一个线程拥有,使线程能够 协调对共享资源的互斥访问

临界截面对象提供与此类似的同步 由互斥对象提供,但关键部分对象可以 仅由单个进程的线程使用

互斥临界区之间的另一个区别是 临界截面对象当前由另一个线程拥有,
EnterCriticalSection()
无限期地等待所有权,而 与互斥对象一起使用的WaitForSingleObject(),允许您 指定超时

信号量将计数保持在零和某个最大值之间, 限制同时访问数据库的线程数 共享资源


Wikipedia有一个很好的章节介绍:

互斥锁本质上与二进制信号量相同 有时使用相同的基本实现。两者的区别 它们是:

互斥体有一个所有者的概念,即进程 锁定了互斥锁。只有锁定互斥锁的进程才能 打开它。相反,信号量没有所有者的概念。任何 进程可以解锁信号量

与信号量不同,互斥锁提供 优先级反转安全。由于互斥体知道其当前所有者,因此 在任何情况下,都有可能提升所有者的优先级 高优先级任务开始等待互斥锁

互斥体还提供 删除安全,其中无法删除保存互斥体的进程 意外删除。信号量不提供这一点


Wikipedia有一个很好的章节介绍:

互斥锁本质上与二进制信号量相同 有时使用相同的基本实现。两者的区别 它们是:

互斥体有一个所有者的概念,即进程 锁定了互斥锁。只有锁定互斥锁的进程才能 打开它。相反,信号量没有所有者的概念。任何 进程可以解锁信号量

不像s
  X   Y   Z          Name
 --- --- --- ------------------------
  0   ∞   ∞   Semaphore              
  0   ∞   1   Binary Semaphore       
  0   1   ∞   SemaphoreSlim          
  0   1   1   Binary SemaphoreSlim(?)
  1   ∞   ∞   Recursive-Mutex(?)     
  1   ∞   1   Mutex                  
  1   1   ∞   N/A(?)                 
  1   1   1   Lock/Monitor           
lock(netWorth) {
  ...
}