Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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_Process_Synchronization_Semaphore_Critical Section - Fatal编程技术网

Concurrency 进程同步和计数信号量

Concurrency 进程同步和计数信号量,concurrency,process,synchronization,semaphore,critical-section,Concurrency,Process,Synchronization,Semaphore,Critical Section,我正在学习计算信号量,但不理解它。我读了几乎所有的文章,但还是很难理解 以下是我对马桶钥匙的理解示例() 这里, 厕所-临界区 键信号量 人-过程 如果我在上述方面有错,请纠正我。我的问题是: 1) “信号量将共享资源的同时用户数量限制为最大数量”。对共享变量的同时访问不会导致竞相条件吗 2) 进程获取信号量后,它是否会在关键部分运行?(基于示例) 3) 如果一个进程在它的CS中,而另一个进程获取了信号量,那么它是同时运行它的CS还是在等待 如果我的问题是基本的,请原谅,但我正在努力理解。请用一

我正在学习计算信号量,但不理解它。我读了几乎所有的文章,但还是很难理解

以下是我对马桶钥匙的理解示例() 这里,

厕所-临界区

键信号量

人-过程

如果我在上述方面有错,请纠正我。我的问题是:

1) “信号量将共享资源的同时用户数量限制为最大数量”。对共享变量的同时访问不会导致竞相条件吗

2) 进程获取信号量后,它是否会在关键部分运行?(基于示例)

3) 如果一个进程在它的CS中,而另一个进程获取了信号量,那么它是同时运行它的CS还是在等待


如果我的问题是基本的,请原谅,但我正在努力理解。请用一个例子解释信号灯?

假设有一个贵宾室。房间里最多可以有3个人。将你的信号灯设置为3

信号灯是你的保镖,防止第四个人进入房间

它是如何工作的?您可以使用信号量调用两个函数:
wait()
signal()

wait()。如果新值为负值,则必须等待该值再次为正值

所以你从信号量=3开始。随着每个人进入房间,它减少了1

第1人进入……sem=2

第2人进入……sem=1

第三人进入……sem=0

第四个人试图进去,但现在sem=-1,我们的保镖不让他进去。所以,他必须等待直到有人离开房间

当你处理完关键部分后,你可以
signal()
让外人知道他现在可以进入了。如您所知,此函数将信号量值增加1

互斥量是信号量=1

线程A:

mutex.wait(); //makes mutex = 0
CS();
mutex.signal();
线程B:

mutex.wait(); //has to wait until A signals so the mutex = 1 again
CS();
mutex.signal();
在这个实现中,当A运行时,B无法到达CS,在CS中他使用上下文开关更改一些全局变量。B必须等到A完成。反之亦然

为了更好地理解信号量,您可以检查著名的问题,如生产者和消费者、理发店、餐饮哲学家。。。有很多。我相信这样会更有趣,场景会让你更容易理解。 而且,我认为这是非常有用的

希望这有帮助