#include<atomic>#include<thread>#include<assert.h>#include<iostream>#include<vector>#include<set>#include<map>#include<string>#include<shared_mutex>#include<atomic>#include"threadPool.h"usingnamespace std;
mutex dataListLock;
set<int> dataList;int RET_OK =0;int RET_ERROR =-1;// demo用于随机产生返回结果boolrandomResult(){staticint i =1;
i++;return(i %5)==0||(i %7)==0||(i %3)==0;}voidproducerFunc(){staticint value =10;
value++;if(randomResult()){// 生产者正在生产数据
unique_lock<mutex>uniqueLock(dataListLock);
cout <<"producer processing. dataList.size(): "<< dataList.size()<< endl;}else{// 生产者成功生产一个数据
unique_lock<mutex>uniqueLock(dataListLock);
dataList.insert(value);
cout <<"produce a new. value : "<< value <<" dataList.size(): "<< dataList.size()<< endl;}}voidproducerThread(threadPool *p){int input =0;while(true){
cin >> input;// 输入触发
p->addTask(producerFunc);}}intconsumerFunc(int value){int ret = RET_ERROR;if(randomResult()){// 处理失败将数据加入队列等待重新处理
ret = RET_ERROR;
unique_lock<mutex>uniqueLock(dataListLock);
dataList.insert(value);
cout <<"consumer process fail. value : "<< value <<" dataList.size(): "<< dataList.size()<< endl;}else{
unique_lock<mutex>uniqueLock(dataListLock);
cout <<"consumer process success. value : "<< value <<" dataList.size(): "<< dataList.size()<< endl;
ret = RET_OK;}return ret;}voidconsumerThread(threadPool *p){while(true){// 可选择休眠// this_thread::sleep_for(chrono::seconds(5));
set<int> dataListTmp;// 将生产者产生的数据全部取出等待处理{
unique_lock<mutex>uniqueLock(dataListLock);
dataList.swap(dataListTmp);}/*可监听处理结果
map<int, future<int>> retList;
*/// 循环处理产生的数据for(auto&value : dataListTmp){
retList[value]= p->addTask(consumerFunc, value);}/*根据处理结果处理
for (auto &value : retList) {
auto ret = value.second.get(); // 阻塞等待结果出来
}
*/}}voidinitTask(){
unique_lock<mutex>uniqueLock(dataListLock);
dataList.insert(1);
dataList.insert(2);
dataList.insert(3);
dataList.insert(4);}intmain(){// 初始化任务initTask();
threadPool producerPool(2);// 生产者线程池 2个线程
threadPool consumerPool(2);// 消费者线程池 2个线程
thread producer(producerThread,&producerPool);
thread consumer(consumerThread,&consumerPool);
producer.join();
consumer.join();return0;}
运行结果:
NAVER@CD-1113-1 MINGW64 /c/Code/C++/Test/testMain
$ g++ -g -o main main.cpp
NAVER@CD-1113-1 MINGW64 /c/Code/C++/Test/testMain
$ ./main.exe
consumer process success. value : 1 dataList.size(): 0
consumer process fail. value : 2 dataList.size(): 1
consumer process fail. value : 4 dataList.size(): 2
consumer process success. value : 3 dataList.size(): 2
consumer process fail. value : 2 dataList.size(): 1
consumer process fail. value : 4 dataList.size(): 1
consumer process success. value : 2 dataList.size(): 0
consumer process fail. value : 4 dataList.size(): 1
consumer process fail. value : 4 dataList.size(): 1
consumer process success. value : 4 dataList.size(): 0
1
producer processing. dataList.size(): 0
2
produce a new. value : 12 dataList.size(): 1
consumer process fail. value : 12 dataList.size(): 1
consumer process fail. value : 12 dataList.size(): 1
consumer process success. value : 12 dataList.size(): 0
3
produce a new. value : 13 dataList.size(): 1
consumer process fail. value : 13 dataList.size(): 1
consumer process success. value : 13 dataList.size(): 0
4
producer processing. dataList.size(): 0
3
producer processing. dataList.size(): 0
1
produce a new. value : 16 dataList.size(): 1
consumer process success. value : 16 dataList.size(): 0
2312
producer processing. dataList.size(): 0
123
producer processing. dataList.size(): 0
123
produce a new. value : 19 dataList.size(): 1
consumer process fail. value : 19 dataList.size(): 1
consumer process fail. value : 19 dataList.size(): 1
consumer process success. value : 19 dataList.size(): 0