#include <iostream>
#include <functional>
#include <thread>
#include <mutex>
#include <unordered_map>
#include <cstdlib>
class Work {
private:
std::mutex deskMutex;
std::mutex chairMutex;
int deskCount = 500;
int chairCount = 500;
public:
std::unordered_map<unsigned int, int> chairTask;
std::unordered_map<unsigned int, int> deskTask;
void clearDesk() {
deskMutex.lock();
if (deskCount > 0) {
std::thread::id idCurrect = std::this_thread::get_id();
printf("线程%d\t清理了第%d个桌子\n", idCurrect, deskCount);
deskCount--;
deskTask[*(unsigned int*)&idCurrect]++;
}
deskMutex.unlock();
}
void clearChair() {
chairMutex.lock();
if (chairCount > 0) {
std::thread::id idCurrect = std::this_thread::get_id();
printf("线程%d\t清理了第%d个椅子\n", idCurrect, chairCount);
chairCount--;
chairTask[*(unsigned int*)&idCurrect]++;
}
chairMutex.unlock();
}
void work() {
while (true) {
int kase = rand() % 2;
if (kase == 0) {
clearDesk();
}
else {
clearChair();
}
if (chairCount <= 0 && deskCount <= 0)
break;
}
}
};
int main() {
Work work;
std::thread thread1(std::bind(&Work::work, &work));
std::thread thread2(std::bind(&Work::work, &work));
thread1.join();
thread2.join();
for (auto&[name, cnt] : work.chairTask) {
std::cout << name << "清理了" << cnt << "个椅子" << std::endl;
}
for (auto& [name, cnt] : work.deskTask) {
std::cout << name << "清理了" << cnt << "个桌子" << std::endl;
}
return 0;
}