什麼是執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立線www.cppcns.com程後自動啟動這些任務。執行緒池執行緒都是後台執行緒。每個執行緒都使用預設的堆疊大小,以預設的優先順序執行,並處於多執行緒單元中。如果某個執行緒在託管**中空閒(如正在等待某個事件),則執行緒池將插入另乙個輔助線程來使所有處理器保持繁忙。如果所有執行緒池執行緒都始終保持繁忙,但佇列中包含掛起的工作,則執行緒池將在一段時間後建立另乙個輔助線程但執行緒的數目永遠不會超過最大值。超過最大值的執行緒可以排隊,但他們要等到其他執行緒完成後才啟動。
不使用執行緒池有哪些弊端
建立太多執行緒,將會浪費一定的資源,有些執行緒未被充分使用。
銷毀太多執行緒,將導致之後浪費時間再次建立它們。
建立執行緒太慢,將會導致長時間的等待,效能變差。
銷毀執行緒太慢,導致其它執行緒資源飢餓。
執行緒池的組成部分
1、執行緒池管理器(threadpoolmanager):用於建立並管理執行緒池
2、工作執行緒(workthread): 執行緒池中線程
3、任務介面(task):每個任務必須實現的介面,以供工作執行緒排程任務的執行。
4、任務佇列:用於存放沒有處理的任務。提供一種緩衝機制
下面直接看**實現
threadpoolmanage.hpp
#pragma once
#include
#include
#include
#include
#include
/** 抽象一ecwidnay個任務 根據自己的需求擴充套件
*/class abstask
;template
class threadpoolmanage
); if (this->mthreadstatus && this->mtasks.empty())
//獲取佇列頭部的任務
auto task = std::move(this->mtasks.front());
//任務出隊
this->mtasks.pop();
//執行工作
task.run();
} });
} }~threadpoolmanage()
//程式設計客棧通知所有執行緒起來工作 然後退出
this->mcondition.notify_all();
//等待所有執行緒工作完畢
for (std::thread& worker : this->mworkers) }
} /*
* 新增任務到任務佇列
*/ void addtask(_ty& task)
mtasks.emplace(std::move(task));
mcondition.notify_one();
}private:
/* * 工作執行緒池
*/ std::vector<:thread> mworkers;
/* * 任務佇列
*/ std::queue<_ty> mtasks;
/* 工作執行緒的最大併發數量
*/ unsigned int mmaxthreadnum;
/* 條件變數 控制線程池中線程的工作狀態
*/ std::condition_variable mcondition;
/* * 工作執行緒鎖
*/ std::mutex mqueue_mutex;
/* * 控制線程的開關 false 繼續工作 true 退出執行緒
*/ bool mthreadstatus;
};呼叫**
main.cpp
#include
#include
#include "threadpool.hpp"
class task :public abstask
};int main()
std::cin.get();
system("pause");
}
C 11 執行緒池簡單實現
話不多說,先上 pragma once include include include include include include include include const int max threads 1000 typedef std function void void task int...
C 11 簡單實現執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後自動啟動這些任務。執行緒池執行緒都是後台執行緒。每個執行緒都使用預設的堆疊大小,以預設的優先順序執行,並處於多執行緒單元中。如果某個執行緒在託管 中空閒 如正在等待某個事件 則執行緒池將插入另乙個輔助線程來使所有處理器保持...
C 11 執行緒池實現
c 11中已經新增了跨平台的thread相關工具,在一些輕量級使用場景中,使用std thread無疑會給我們帶來很多方便。這裡使用它實現了乙個簡單的執行緒池 easythreadpool.h ifndef easy thread pool h define easy thread pool h i...