#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--;
//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("线程%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;
}
C++实现 多线程擦桌子椅子
最新推荐文章于 2024-09-15 11:40:06 发布