C++11 STL线程库实现一个简单的线程池

使用C++11 STL线程库实现一个线程池。处理机制是抢占式的,即所有线程从一个队列(std::queue)中获取任务执行(计算字符串简单HASH值),使用std::mutex和std::conditional_variable实现队列访问并发协调。

1#include <iostream> 2#include <iomanip> 3#include <thread> 4#include <mutex> 5#include <string> 6#include <queue> 7#include <condition_variable> 8#include <algorithm> 9#include <sstream> 10 11using namespace std; 12 13static std::mutex G_lockPrint; 14 15void print_message(int value, const string& str) { 16 lock_guard<mutex> lock(G_lockPrint); 17 cout<<setw(8)<<right<<this_thread::get_id(); 18 cout<<setw(12)<<right<<value<<" "<<str<<endl; 19} 20 21#define THREAD_COUNT 10 22int main() 23{ 24 thread thpool[THREAD_COUNT]; 25 mutex quelock; 26 condition_variable quecv; 27 queue<string> strqueue; 28 29 volatile bool stop = false; 30 31 for(int i = 0; i < THREAD_COUNT; ++i ) { 32 thpool[i] = thread([&quelock, &quecv, &strqueue, &stop]() 33 { 34 string str; 35 while ( !stop ) { 36 { 37 unique_lock<mutex> lock(quelock); 38 if ( strqueue.empty() ) { 39 auto ret = quecv.wait_for(lock, chrono::seconds(1)); 40 if ( ret == cv_status::timeout) continue; 41 } 42 43 if ( !strqueue.empty() ) { 44 str = strqueue.front(); 45 strqueue.pop(); 46 } else { 47 continue; 48 } 49 } 50 51 int hash = 0; 52 for(size_t i = 0; i < str.length(); ++i) { 53 hash = (hash << 5) - i + str[i]; 54 } 55 print_message(hash, str); 56 } // end while 57 } 58 ); 59 } 60 61 for(int i = 0; i < 100000; ++i) { 62 stringstream ss; 63 ss<<"aaaaa_"<<i; 64 lock_guard<mutex> lock(quelock); 65 strqueue.push(ss.str()); 66 quecv.notify_one(); 67 } 68 69 while (1) { 70 this_thread::sleep_for(chrono::seconds(1)); 71 lock_guard<mutex> lock(quelock); 72 if ( strqueue.empty()) break; 73 } 74 stop = true; 75 for(int i = 0; i < THREAD_COUNT; ++i ) thpool[i].join(); 76 cout<<"program exit"<<endl; 77 return 0; 78}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )