Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading 互斥和signal()和wait()操作_Multithreading_Mutex_Semaphore - Fatal编程技术网

Multithreading 互斥和signal()和wait()操作

Multithreading 互斥和signal()和wait()操作,multithreading,mutex,semaphore,Multithreading,Mutex,Semaphore,关于互斥体,我有两个问题: 1.当互斥变量等于1时,我们对它执行signal()操作,会发生什么? 2.当互斥量等于0时,我们执行wait(),线程被阻塞,互斥量保持为0。对的一段时间后,另一个线程执行signal()操作,然后释放阻塞。现在互斥锁的值是多少?0还是1 所以从概念上讲,互斥锁有两种状态:锁定和解锁。它是否由0或1表示在这里并不重要 如果解锁(即发信号)互斥锁,它会将其状态从锁定更改为解锁。进一步解锁不会改变其状态,实际上也不会做任何事情 如果一个互斥锁被解锁,并且您调用wait,

关于互斥体,我有两个问题: 1.当互斥变量等于1时,我们对它执行signal()操作,会发生什么?
2.当互斥量等于0时,我们执行wait(),线程被阻塞,互斥量保持为0。对的一段时间后,另一个线程执行signal()操作,然后释放阻塞。现在互斥锁的值是多少?0还是1

所以从概念上讲,互斥锁有两种状态:锁定和解锁。它是否由0或1表示在这里并不重要

如果解锁(即发信号)互斥锁,它会将其状态从锁定更改为解锁。进一步解锁不会改变其状态,实际上也不会做任何事情

如果一个互斥锁被解锁,并且您调用wait,那么该调用什么也不做(它不等待),线程继续执行

当一个互斥锁被锁定并调用wait时,线程被阻塞。当其他线程调用unlock时,阻塞被释放,互斥锁被解锁


最重要的是解锁和锁定操作是原子的,因为并行调用不能相互重叠以产生损坏的结果(形式上:对锁定/解锁的并行调用总是相当于一些序列化的调用历史)。否则,互斥的整个概念都将是愚蠢的。:)

所以从概念上讲,互斥锁有两种状态:锁定和解锁。它是否由0或1表示在这里并不重要

如果解锁(即发信号)互斥锁,它会将其状态从锁定更改为解锁。进一步解锁不会改变其状态,实际上也不会做任何事情

如果一个互斥锁被解锁,并且您调用wait,那么该调用什么也不做(它不等待),线程继续执行

当一个互斥锁被锁定并调用wait时,线程被阻塞。当其他线程调用unlock时,阻塞被释放,互斥锁被解锁


最重要的是解锁和锁定操作是原子的,因为并行调用不能相互重叠以产生损坏的结果(形式上:对锁定/解锁的并行调用总是相当于一些序列化的调用历史)。否则,互斥的整个概念都将是愚蠢的。:)

在阅读了这些评论(以及未经编辑的原始问题)之后,很明显,有足够多的人相信二进制符号可以与互斥体互换。如果我们用实际的术语(即,
pthread mutex
和systemv
semaphore
),它们是非常不同的。我将在下面概述最重要的区别

  • 概念所有权。互斥锁属于他们的储物柜,sempahores不属于任何人。这导致了两个区别非常重要一个是互斥锁只能(应该)由所有者(锁定线程)解锁,而sempahores可以由任何线程解锁(请参见下面的权限)。不太重要的是,互斥锁可以重新进入——也就是说,可以使用所有者线程多次锁定——而信号量不能这样做。我说它不那么重要,因为可重入互斥体几乎总是存在设计缺陷
  • 信号量是或多或少与用户无关的对象。它们可以由完全不相关的进程或线程创建、使用和销毁,这些进程或线程甚至不必相互了解(或同时执行)。例如,一个进程可能会创建一个信号量,而不是死亡,其他进程可以使用它,而第三个进程将删除它)。信号量具有与其相关联的权限(与文件权限不同),而互斥体则没有这类权限——任何技术上有权访问互斥体的人都可以使用它做任何事情
  • 信号量是进程共享的。也就是说,它们可以由多个进程使用,而无需额外的努力。默认互斥体仅为单进程,如果同一互斥体将由多个进程使用,则必须以特殊模式创建

  • 在阅读了这些评论(以及原始的未经编辑的问题)之后,很明显有足够多的人相信二进制符号可以与互斥体互换。如果我们用实际的术语(即,
    pthread mutex
    和systemv
    semaphore
    ),它们是非常不同的。我将在下面概述最重要的区别

  • 概念所有权。互斥锁属于他们的储物柜,sempahores不属于任何人。这导致了两个区别非常重要一个是互斥锁只能(应该)由所有者(锁定线程)解锁,而sempahores可以由任何线程解锁(请参见下面的权限)。不太重要的是,互斥锁可以重新进入——也就是说,可以使用所有者线程多次锁定——而信号量不能这样做。我说它不那么重要,因为可重入互斥体几乎总是存在设计缺陷
  • 信号量是或多或少与用户无关的对象。它们可以由完全不相关的进程或线程创建、使用和销毁,这些进程或线程甚至不必相互了解(或同时执行)。例如,一个进程可能会创建一个信号量,而不是死亡,其他进程可以使用它,而第三个进程将删除它)。信号量具有与其相关联的权限(与文件权限不同),而互斥体则没有这类权限——任何技术上有权访问互斥体的人都可以使用它做任何事情
  • 信号量是进程共享的。也就是说,它们可以由多个进程使用,而无需额外的努力。默认互斥体仅为单进程,如果同一互斥体将由多个进程使用,则必须以特殊模式创建

  • 你为什么不读你的课本或者做谷歌搜索呢?互斥上的“信号”是什么?另外,互斥量不是0或1,而是锁定或解锁的。Pthread互斥量没有1或0值,但可以锁定或解锁。读一本好书。