C + + 동시 프로 그래 밍 (4): 아시아 기반 스 레 드 풀

현재 프로젝트 에 사용 되 는 스 레 드 풀 (자세 한 내용 은:http://threadpool.sourceforge...) 사용 할 수 있 지만 코드 가 복잡 하고 오랫동안 유지 보수 하 는 사람 이 없습니다.
본 고 는 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)

참고:
  • A Thread Pool with Boost.Threads and Boost.Asio
  • Why do we need to use boost::asio::io_service::work?
  • 좋은 웹페이지 즐겨찾기