parent
							
								
									603f89baa6
								
							
						
					
					
						commit
						8dcca18674
					
				
				 5 changed files with 88 additions and 8 deletions
			
			
		@ -0,0 +1,79 @@ | 
				
			|||||||
 | 
					#pragma once | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <condition_variable> | 
				
			||||||
 | 
					#include <functional> | 
				
			||||||
 | 
					#include <mutex> | 
				
			||||||
 | 
					#include <queue> | 
				
			||||||
 | 
					#include <thread> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Bk 
 | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    class ThreadPool | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        public: | 
				
			||||||
 | 
					            ThreadPool(size_t num_threads | 
				
			||||||
 | 
					                = std::thread::hardware_concurrency()) | 
				
			||||||
 | 
					            { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (size_t i = 0; i < num_threads; ++i) { | 
				
			||||||
 | 
					                    threads_.emplace_back([this] { | 
				
			||||||
 | 
					                        while (true) { | 
				
			||||||
 | 
					                            std::function<void()> task; | 
				
			||||||
 | 
					                            { | 
				
			||||||
 | 
					                                std::unique_lock<std::mutex> lock(queue_mutex_); | 
				
			||||||
 | 
					                                cv_.wait(lock, [this] { | 
				
			||||||
 | 
					                                    return !tasks_.empty() || stop_; | 
				
			||||||
 | 
					                                }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                if (stop_ && tasks_.empty()) { | 
				
			||||||
 | 
					                                    return; | 
				
			||||||
 | 
					                                } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                task = std::move(tasks_.front()); | 
				
			||||||
 | 
					                                tasks_.pop(); | 
				
			||||||
 | 
					                            } | 
				
			||||||
 | 
					                            task(); | 
				
			||||||
 | 
					                        } | 
				
			||||||
 | 
					                    }); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ~ThreadPool() | 
				
			||||||
 | 
					            { | 
				
			||||||
 | 
					                { | 
				
			||||||
 | 
					                    std::unique_lock<std::mutex> lock(queue_mutex_); | 
				
			||||||
 | 
					                    stop_ = true; | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                cv_.notify_all(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (auto& thread : threads_) { | 
				
			||||||
 | 
					                    thread.join(); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            void queue(std::function<void()> task) | 
				
			||||||
 | 
					            { | 
				
			||||||
 | 
					                { | 
				
			||||||
 | 
					                    std::unique_lock<std::mutex> lock(queue_mutex_); | 
				
			||||||
 | 
					                    tasks_.emplace(std::move(task)); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					                cv_.notify_one(); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            void stop() | 
				
			||||||
 | 
					            { | 
				
			||||||
 | 
					                std::unique_lock<std::mutex> lock(queue_mutex_); | 
				
			||||||
 | 
					                stop_ = true; | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private: | 
				
			||||||
 | 
					            std::vector<std::thread> threads_; | 
				
			||||||
 | 
					            std::queue<std::function<void()> > tasks_; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            std::mutex queue_mutex_; | 
				
			||||||
 | 
					            std::condition_variable cv_; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            bool stop_ = false; | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue