我正在使用信号量做一些同步线程。现在我要做的是等待一些客户线程使用floor_clerk线程中的信号量到达队列。我之前使用while循环做它。客户线程也必须等待,直到map_clerk也使用信号量帮助它。我之前使用深度睡眠做这件事。 必须使用P(信号量)(获取)实现任何等待这是等待应该完成的方式。 这是任务: 地板职员等待(使用信号量)客户到达;然后,他们帮助他们获得他们需要的任何信息。但是,地板职员一次只能帮助一个客户;因此,客户必须等待(使用信号量)为可用的职员提供帮助。
我之前的Floor_clerk等待代码是:
while (done != Main.csize) {
//wait while their is no customer in queue
while (queue.isEmpty() && done != Main.csize) {
}
//while their is a customer in queue assist customers
while (queue.size() != 0 && done != Main.csize) {
//some stuff to do
}
}
请帮我在这里实现信号量。
答案 0 :(得分:0)
只需将您的客户端存储在阻塞队列中,然后使用take()
方法阻止,直到有可用的客户端为止。没有必要将队列和阻塞机制分开,因为它已经内置到库中。
如果你必须使用信号量,信号量通过基本上具有“许可”的阻塞队列来工作。您应该考虑这种阻止功能如何适合您要执行的操作。当有可用的客户端时,您希望release()
许可并允许服务acquire()
。如果没有任何许可,则该服务将在acquire()
上阻止。
// Add client
queue.add(client);
semaphore.release();
// Clerk loop
while (true) { // Whatever condition
semaphore.acquire();
Client client = queue.remove();
// ...
}