.实现睡觉的理发师问题(同步互斥方式采用信号量或mutex方式均可) 理发师问题的描述:一个理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉;第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座位上等待;如果顾客来时没有空座位了,他就离开,不理发了;当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。
时间: 2024-02-26 08:56:53 浏览: 121
这是一个经典的同步问题,可以使用信号量或mutex方式来解决。下面给出使用mutex方式的实现:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
mutex m; // 用于互斥访问共享资源
condition_variable cv; // 用于等待和唤醒线程
bool is_barber_sleeping = true; // 理发师是否在睡觉
int num_waiting_customers = 0; // 等待理发的顾客数
void barber() {
while (true) {
unique_lock<mutex> lock(m); // 加锁
while (num_waiting_customers == 0) { // 如果没有顾客在等待
cout << "The barber is sleeping." << endl;
is_barber_sleeping = true;
cv.wait(lock); // 等待顾客的到来
}
is_barber_sleeping = false;
num_waiting_customers--;
cout << "The barber is cutting hair." << endl;
lock.unlock(); // 解锁
this_thread::sleep_for(chrono::seconds(1)); // 模拟理发师理发
}
}
void customer() {
unique_lock<mutex> lock(m); // 加锁
if (num_waiting_customers == n) { // 如果没有空座位了
cout << "No available seat. The customer is leaving." << endl;
return;
}
num_waiting_customers++;
cout << "The customer is waiting." << endl;
if (is_barber_sleeping) { // 如果理发师正在睡觉
cout << "The barber is woken up." << endl;
cv.notify_one(); // 唤醒理发师
}
lock.unlock(); // 解锁
}
int main() {
thread t1(barber);
for (int i = 0; i < 10; i++) {
thread t2(customer);
this_thread::sleep_for(chrono::seconds(1)); // 模拟顾客到来的间隔
t2.detach();
}
t1.join();
return 0;
}
```
上述代码中,使用了一个互斥量(mutex)和一个条件变量(condition_variable)来实现同步。具体实现如下:
1. barber()函数是理发师线程的函数体,无限循环执行以下步骤:
- 获取互斥锁,确保对共享资源的互斥访问。
- 检查是否有等待的顾客,如果没有则等待顾客的到来。
- 将is_barber_sleeping标记为false,表示理发师正在工作。
- 将num_waiting_customers减1,表示已经为一个顾客理过发。
- 解锁互斥锁,释放对共享资源的控制。
- 模拟理发过程。
2. customer()函数是顾客线程的函数体,执行以下步骤:
- 获取互斥锁,确保对共享资源的互斥访问。
- 检查是否有空座位,如果没有则离开。
- 将num_waiting_customers加1,表示有一个顾客等待理发。
- 如果理发师正在睡觉,则唤醒理发师。
- 解锁互斥锁,释放对共享资源的控制。
3. 主函数创建一个理发师线程和多个顾客线程,并等待线程的结束。
阅读全文