Multithreading 使用不同的信号量同步线程(客户端)

Multithreading 使用不同的信号量同步线程(客户端),multithreading,winapi,mutex,semaphore,thread-synchronization,Multithreading,Winapi,Mutex,Semaphore,Thread Synchronization,该程序的要点是:您需要模拟酒店的工作,其中线程是客户。酒店拥有3间每晚1000学分的客房、5间每晚1500学分的客房和1间每晚2500学分的客房。进入酒店的客户有一定的金额,如果他有空,他可以根据自己的经济能力获得一个房间。如果客户可入住的房间中没有空房,客户将离开,到另一个地方过夜。创建一个模拟酒店运营的应用程序 我的想法是: 酒店房间的每个级别都有一个信号灯(即只有三个)。我创建线程,每个线程都有一定数量的信用。客户机总是选择更昂贵的选项,这对他来说是可以承受的(假设这将通过条件循环实现)

该程序的要点是:您需要模拟酒店的工作,其中线程是客户。酒店拥有3间每晚1000学分的客房、5间每晚1500学分的客房和1间每晚2500学分的客房。进入酒店的客户有一定的金额,如果他有空,他可以根据自己的经济能力获得一个房间。如果客户可入住的房间中没有空房,客户将离开,到另一个地方过夜。创建一个模拟酒店运营的应用程序

我的想法是: 酒店房间的每个级别都有一个信号灯(即只有三个)。我创建线程,每个线程都有一定数量的信用。客户机总是选择更昂贵的选项,这对他来说是可以承受的(假设这将通过条件循环实现)

但问题是:

  • 如果酒店房间在金钱上对客户是可用的,但所有房间都将被占用,该怎么办:在这种情况下,线程将进入等待状态,它将不得不等待另一个线程退出受控资源并传递信号量,但在分配时,它应该使用更便宜的版本(也就是说,它应该从一个“昂贵”的信号灯变成一个“便宜”的信号灯)
  • 我可以使用WaitForSingleObject(句柄,0)检查信号量的信号状态,其中0是等待的时间(即立即返回)。如果函数返回WAIT_OBJECT_0,这意味着线程应该使用更便宜的信号量。但问题是,检查信号量的信号状态的过程不是原子的,当两个线程都接收到信号量计数器为1的信息时,可能会发生线程争用,然后两个线程都将尝试通过粗略的信号量,但只有一个线程能够做到这一点
  • 注:

  • WinAPI
  • 在这个节目中只有一个晚上(大约5秒),之后节目结束
  • 受控资源中的线程睡眠5秒
  • 当所有线程都关闭时,程序结束
  • 如果流没有找到酒店房间,那么它会立即关闭

  • 任何人都知道如何绕过信号量限制?或者是否值得以某种方式(使用互斥锁、事件)实现该程序?

    这个问题与睡眠理发师问题非常相似。您可以查看一些想法。