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:
- std::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:
- std::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;
- {
- std::unique_lock<std::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
|