| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | 
							- /*
 
-  * CThreadHelper.h, part of VCMI engine
 
-  *
 
-  * Authors: listed in file AUTHORS in main folder
 
-  *
 
-  * License: GNU General Public License v2.0 or later
 
-  * Full text of license available in license.txt file, in main folder
 
-  *
 
-  */
 
- #pragma once
 
- VCMI_LIB_NAMESPACE_BEGIN
 
- ///DEPRECATED
 
- /// Can assign CPU work to other threads/cores
 
- class DLL_LINKAGE CThreadHelper
 
- {
 
- public:
 
- 	using Task = std::function<void()>;
 
- 	CThreadHelper(std::vector<std::function<void()> > *Tasks, int Threads);
 
- 	void run();
 
- private:
 
- 	boost::mutex rtinm;
 
- 	int currentTask;
 
- 	int amount;
 
- 	int threads;
 
- 	std::vector<Task> *tasks;
 
- 	void processTasks();
 
- };
 
- template<typename Payload>
 
- class ThreadPool
 
- {
 
- public:
 
- 	using Task = std::function<void(std::shared_ptr<Payload>)>;
 
- 	using Tasks = std::vector<Task>;
 
- 	ThreadPool(Tasks * tasks_, std::vector<std::shared_ptr<Payload>> context_)
 
- 		: currentTask(0),
 
- 		amount(tasks_->size()),
 
- 		threads(context_.size()),
 
- 		tasks(tasks_),
 
- 		context(context_)
 
- 	{}
 
- 	void run()
 
- 	{
 
- 		std::vector<boost::thread> group;
 
- 		for(size_t i=0; i<threads; i++)
 
- 		{
 
- 			std::shared_ptr<Payload> payload = context.at(i);
 
- 			group.emplace_back(std::bind(&ThreadPool::processTasks, this, payload));
 
- 		}
 
- 		for (auto & thread : group)
 
- 			thread.join();
 
- 		//thread group deletes threads, do not free manually
 
- 	}
 
- private:
 
- 	boost::mutex rtinm;
 
- 	size_t currentTask;
 
- 	size_t amount;
 
- 	size_t threads;
 
- 	Tasks * tasks;
 
- 	std::vector<std::shared_ptr<Payload>> context;
 
- 	void processTasks(std::shared_ptr<Payload> payload)
 
- 	{
 
- 		while(true)
 
- 		{
 
- 			size_t pom;
 
- 			{
 
- 				boost::unique_lock<boost::mutex> lock(rtinm);
 
- 				if((pom = currentTask) >= amount)
 
- 					break;
 
- 				else
 
- 					++currentTask;
 
- 			}
 
- 			(*tasks)[pom](payload);
 
- 		}
 
- 	}
 
- };
 
- /// Sets thread name that will be used for both logs and debugger (if supported)
 
- /// WARNING: on Unix-like systems this method should not be used for main thread since it will also change name of the process
 
- void DLL_LINKAGE setThreadName(const std::string &name);
 
- /// Sets thread name for use in logging only
 
- void DLL_LINKAGE setThreadNameLoggingOnly(const std::string &name);
 
- /// Returns human-readable thread name that was set before, or string form of system-provided thread ID if no human-readable name was set
 
- std::string DLL_LINKAGE getThreadName();
 
- VCMI_LIB_NAMESPACE_END
 
 
  |