竞争条件会在信号量中发生吗?
Can Race Condition Happen In Semaphore?
注意:我的问题仍然没有答案,因为唯一的答案存在严重的逻辑缺陷和错误的假设。
给定以下代码(来自我的数字教科书):
为什么没有竞争条件?
例如:
sem_wait(&barber_ready)
和 sem_post(&barber_ready)
因为我们可以同时结束更新 barber_ready 一次 +1 和一次 -1。
来自 sem_wait
上的 man page:
sem_wait() decrements (locks) the semaphore pointed to by sem.
If the semaphore's value is greater than zero, then the decrement
proceeds, and the function returns, immediately. If the
semaphore currently has the value zero, then the call blocks
until either it becomes possible to perform the decrement (i.e.,
the semaphore value rises above zero), or a signal handler
interrupts the call.
重要的是 - sem-wait
是一个 原子函数 - 这意味着它以原子方式递减信号量的值,避免与 sem_post
.[=20 的竞争条件=]
因此,要么在 sem_wait
之前调用 sem_post
并立即调用 sem_wait
returns,要么首先调用 sem_wait
并且函数阻塞直到 sem_post
增加信号量的值。
现在假设理发师方法首先启动 运行ning:
它会检查是否有任何客户准备好它会发现还没有任何客户准备好,所以它会等待。
现在 customer 方法将 运行 并且它会检查空闲的椅子,并且根据您的评论 free_chairs 将被初始化为 N,
所以它不会等待,然后我们将 customer_ready 加一并唤醒它(customer_ready),然后我们将继续检查 barber_ready 是否不为零但不幸的是它为零,所以我们将等待。
现在调度程序将选择理发师方法,而 customer_ready 我们已经在使用客户方法时将其唤醒并将其递增 1,因此 customer_ready 的值现在将为零,我们将return 从方法中等待并继续。
现在我们将 post 免费椅子(用于下一次迭代)和 post barber_ready 到一个。
现在我们回到 customer 方法,我们停在第 13 行,所以我们已经在第 7 行递增了它,我们将 get_hair cut 所以我们完成。
如果你想尝试另一次迭代,回到理发师方法,我们会再次发现 customer_ready 再次为零,然后重试相同的场景。
如果你想通过从客户开始跟踪另一个场景,从第 11 行开始你不会等待,因为空闲椅子的数量是 N,所以继续,在第 12 行递增 customer_ready,然后递增(行13),我们将等待 barber_ready 递增。
所以回到理发店,你会发现 customer_ready 已经在第 12 行增加了,所以继续,增加 free chairs 然后增加 barber_ready,当我们回到客户那里时,我们会return 来自等待(第 13 行),因为我们已经在第 7 行递增它并继续。
这是两种情况,我们找到了为什么这里没有比赛。
注意:我的问题仍然没有答案,因为唯一的答案存在严重的逻辑缺陷和错误的假设。
给定以下代码(来自我的数字教科书):
为什么没有竞争条件?
例如:
sem_wait(&barber_ready)
和 sem_post(&barber_ready)
因为我们可以同时结束更新 barber_ready 一次 +1 和一次 -1。
来自 sem_wait
上的 man page:
sem_wait() decrements (locks) the semaphore pointed to by sem. If the semaphore's value is greater than zero, then the decrement proceeds, and the function returns, immediately. If the semaphore currently has the value zero, then the call blocks until either it becomes possible to perform the decrement (i.e., the semaphore value rises above zero), or a signal handler interrupts the call.
重要的是 - sem-wait
是一个 原子函数 - 这意味着它以原子方式递减信号量的值,避免与 sem_post
.[=20 的竞争条件=]
因此,要么在 sem_wait
之前调用 sem_post
并立即调用 sem_wait
returns,要么首先调用 sem_wait
并且函数阻塞直到 sem_post
增加信号量的值。
现在假设理发师方法首先启动 运行ning:
它会检查是否有任何客户准备好它会发现还没有任何客户准备好,所以它会等待。
现在 customer 方法将 运行 并且它会检查空闲的椅子,并且根据您的评论 free_chairs 将被初始化为 N,
所以它不会等待,然后我们将 customer_ready 加一并唤醒它(customer_ready),然后我们将继续检查 barber_ready 是否不为零但不幸的是它为零,所以我们将等待。
现在调度程序将选择理发师方法,而 customer_ready 我们已经在使用客户方法时将其唤醒并将其递增 1,因此 customer_ready 的值现在将为零,我们将return 从方法中等待并继续。
现在我们将 post 免费椅子(用于下一次迭代)和 post barber_ready 到一个。
现在我们回到 customer 方法,我们停在第 13 行,所以我们已经在第 7 行递增了它,我们将 get_hair cut 所以我们完成。
如果你想尝试另一次迭代,回到理发师方法,我们会再次发现 customer_ready 再次为零,然后重试相同的场景。
如果你想通过从客户开始跟踪另一个场景,从第 11 行开始你不会等待,因为空闲椅子的数量是 N,所以继续,在第 12 行递增 customer_ready,然后递增(行13),我们将等待 barber_ready 递增。
所以回到理发店,你会发现 customer_ready 已经在第 12 行增加了,所以继续,增加 free chairs 然后增加 barber_ready,当我们回到客户那里时,我们会return 来自等待(第 13 行),因为我们已经在第 7 行递增它并继续。
这是两种情况,我们找到了为什么这里没有比赛。