C + + 동시 프로 그래 밍 (4): 아시아 기반 스 레 드 풀
2466 단어 threadc++11concurrencyboostc + +
본 고 는 Thread 와 Asio 를 결합 하여 하나의 스 레 드 풀 을 실현 했다.하나, 둘, 열 줄 코드, 더 쉬 울 수 없어!
헤더 파일:
#include
#include
#include
#include
#include
#define BOOST_ASIO_NO_DEPRECATED
#include "boost/asio.hpp"
스 레 드 탱크 클래스:
class ThreadPool {
public:
explicit ThreadPool(std::size_t size)
: work_guard_(boost::asio::make_work_guard(io_context_)) {
workers_.reserve(size);
for (std::size_t i = 0; i < size; ++i) {
workers_.emplace_back(&boost::asio::io_context::run, &io_context_);
}
}
~ThreadPool() {
io_context_.stop();
for (auto& w : workers_) {
w.join();
}
}
// Add new work item to the pool.
template
void Enqueue(F f) {
boost::asio::post(io_context_, f);
}
private:
std::vector<:thread> workers_;
boost::asio::io_context io_context_;
typedef boost::asio::io_context::executor_type ExecutorType;
boost::asio::executor_work_guard work_guard_;
};
구성원 변수
work_guard_
는 비동기 작업 이 실행 되 지 않 을 때 도 실행 (즉 io_context
을 되 돌려 주지 않 게 하 는 역할 을 합 니 다.StackOverflow 의 토론: Why should I use ioservice::work? 예시:
// For output.
std::mutex g_io_mutex;
int main() {
// Create a thread pool of 4 worker threads.
ThreadPool pool(4);
// Queue a bunch of work items.
for (int i = 0; i < 8; ++i) {
pool.Enqueue([i] {
{
std::lock_guard<:mutex> lock(g_io_mutex);
std::cout << "Hello" << "(" << i << ") " << std::endl;
}
std::this_thread::sleep_for(std::chrono::seconds(1));
{
std::lock_guard<:mutex> lock(g_io_mutex);
std::cout << "World" << "(" << i << ")" << std::endl;
}
});
}
return 0;
}
출력 (매번 다 름):
Hello(0)
Hello(1)
Hello(2)
Hello(3)
World(3)
World(2)
World(1)
World(0)
참고:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Exception in thread main java.lang. NoClassDefFoundError 오류 해결 방법즉,/home/hadoop/jarfile) 시스템은 Hello World 패키지 아래의class라는 클래스 파일을 실행하고 있다고 오인하여 시스템의 CLASSPATH 아래 (일반적으로 현재 디렉터리를 포함) Hell...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.