#include#include #include #include #include #include class Work { private: //锁,防止多个线程同时修改或访问同一个数据 std::mutex deskMutex; std::mutex chairMutex; //桌子总数 int deskCount = 500; //椅子总数 int chairCount = 500; public: //存贮每个线程擦桌子和擦椅子总数 std::unordered_map chairTask; std::unordered_map deskTask; void clearDesk() { //上锁防止多线程同时清理同个桌子 deskMutex.lock(); if (deskCount > 0) { std::thread::id idCurrect = std::this_thread::get_id(); printf("线程%dt清理了第%d个桌子n", idCurrect, deskCount); deskCount--; //hack获取当前线程id的整数作为key,统计存储每个线程擦桌子的总数 deskTask[*(unsigned int*)&idCurrect]++; } deskMutex.unlock(); } void clearChair() { chairMutex.lock(); if (chairCount > 0) { std::thread::id idCurrect = std::this_thread::get_id(); printf("线程%dt清理了第%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; }



