java中的STL库_C++11 STL线程库实现一个简单的线程池
使用C++11 STL線程庫實現一個線程池。處理機制是搶占式的,即所有線程從一個隊列(std::queue)中獲取任務執行(計算字符串簡單HASH值),使用std::mutex和std::conditional_variable實現隊列訪問并發協調。
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
static std::mutex G_lockPrint;
void print_message(int value, const string& str) {
lock_guard lock(G_lockPrint);
cout<
cout<
}
#define THREAD_COUNT 10
int main()
{
thread thpool[THREAD_COUNT];
mutex quelock;
condition_variable quecv;
queue strqueue;
volatile bool stop = false;
for(int i = 0; i < THREAD_COUNT; ++i ) {
thpool[i] = thread([&quelock, &quecv, &strqueue, &stop]()
{
string str;
while ( !stop ) {
{
unique_lock lock(quelock);
if ( strqueue.empty() ) {
auto ret = quecv.wait_for(lock, chrono::seconds(1));
if ( ret == cv_status::timeout) continue;
}
if ( !strqueue.empty() ) {
str = strqueue.front();
strqueue.pop();
} else {
continue;
}
}
int hash = 0;
for(size_t i = 0; i < str.length(); ++i) {
hash = (hash << 5) - i + str[i];
}
print_message(hash, str);
} // end while
}
);
}
for(int i = 0; i < 100000; ++i) {
stringstream ss;
ss<
lock_guard lock(quelock);
strqueue.push(ss.str());
quecv.notify_one();
}
while (1) {
this_thread::sleep_for(chrono::seconds(1));
lock_guard lock(quelock);
if ( strqueue.empty()) break;
}
stop = true;
for(int i = 0; i < THREAD_COUNT; ++i ) thpool[i].join();
cout<
return 0;
}
總結
以上是生活随笔為你收集整理的java中的STL库_C++11 STL线程库实现一个简单的线程池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 矩阵的对数运算公式_必修一——对数与对数
- 下一篇: 错误:在keystone中无法找到默认角