mirror of https://github.com/alibaba/MNN.git
				
				
				
			
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "WorkerThread.hpp"
 | |
| #include <thread>
 | |
| 
 | |
| #include <MNN/MNNDefine.h>
 | |
| //#define MNN_OPEN_TIME_TRACE
 | |
| #include <MNN/AutoTime.hpp>
 | |
| using namespace std;
 | |
| 
 | |
| namespace MNN {
 | |
| WorkerThread::WorkerThread(int numberThread) {
 | |
|     for (int i=0; i<numberThread; ++i) {
 | |
|         mWorkers.emplace_back([this]() {
 | |
|             while (!mStop) {
 | |
|                 Task* f = nullptr;
 | |
|                 {
 | |
|                     std::unique_lock<std::mutex> _l(mQueueMutex);
 | |
|                     mCondition.wait(_l, [this] { return mStop || mTasks.size() > 0;});
 | |
|                     if (mTasks.empty()) {
 | |
|                         continue;
 | |
|                     }
 | |
|                     f = mTasks.front();
 | |
|                     mTasks.pop();
 | |
|                 }
 | |
|                 f->content();
 | |
|                 delete f;
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| }
 | |
| WorkerThread::~WorkerThread() {
 | |
|     {
 | |
|         std::lock_guard<std::mutex> _l(mQueueMutex);
 | |
|         mStop = true;
 | |
|     }
 | |
|     mCondition.notify_all();
 | |
|     for (auto& worker : mWorkers) {
 | |
|         worker.join();
 | |
|     }
 | |
|     // Complete Remain work
 | |
|     while (!mTasks.empty()) {
 | |
|         auto f = mTasks.front();
 | |
|         f->content();
 | |
|         mTasks.pop();
 | |
|         delete f;
 | |
|     }
 | |
| }
 | |
| 
 | |
| bool WorkerThread::postTask(std::function<int()>&& task) {
 | |
|     {
 | |
|         AUTOTIME;
 | |
|         std::unique_lock<std::mutex> _l(mQueueMutex);
 | |
|         auto taskWrap = new Task;
 | |
|         taskWrap->content = std::move(task);
 | |
|         mTasks.push(taskWrap);
 | |
|     }
 | |
|     mCondition.notify_all();
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| } // namespace MNN
 |