Добавлен базовый вариант пула потоков
This commit is contained in:
parent
f6a6737b99
commit
fe20eb715e
41
include/threadpool.h
Normal file
41
include/threadpool.h
Normal file
@ -0,0 +1,41 @@
|
||||
#ifndef _THREADPOOL_H_
|
||||
#define _THREADPOOL_H_
|
||||
|
||||
#include <thread>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
#include <functional>
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
#include <future>
|
||||
|
||||
class threadpool
|
||||
{
|
||||
private:
|
||||
std::size_t _concurrency;
|
||||
std::queue<std::function<void()>> _queue;
|
||||
std::mutex _mutex;
|
||||
std::condition_variable _cv;
|
||||
std::vector<std::thread> _workers;
|
||||
bool _enabled;
|
||||
|
||||
public:
|
||||
threadpool();
|
||||
threadpool(std::size_t concurrency);
|
||||
~threadpool();
|
||||
|
||||
template <typename R> std::future<R> add_task(std::function<R()> func)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
std::packaged_task<R()> pt(func);
|
||||
std::future<R> fut = pt.get_future();
|
||||
_queue.push([&pt]{ pt(); });
|
||||
_cv.notify_all();
|
||||
return fut;
|
||||
}
|
||||
|
||||
private:
|
||||
void worker_func();
|
||||
};
|
||||
|
||||
#endif // _THREADPOOL_H_
|
||||
@ -78,12 +78,14 @@
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\src\logger.cpp" />
|
||||
<ClCompile Include="..\..\src\log_queue.cpp" />
|
||||
<ClCompile Include="..\..\src\threadpool.cpp" />
|
||||
<ClCompile Include="..\..\src\ustring.cpp" />
|
||||
<ClCompile Include="..\..\src\utf.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\logger.h" />
|
||||
<ClInclude Include="..\..\include\log_queue.h" />
|
||||
<ClInclude Include="..\..\include\threadpool.h" />
|
||||
<ClInclude Include="..\..\include\ustring.h" />
|
||||
<ClInclude Include="..\..\include\utf.h" />
|
||||
</ItemGroup>
|
||||
|
||||
@ -30,6 +30,9 @@
|
||||
<ClCompile Include="..\..\src\utf.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\threadpool.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\log_queue.h">
|
||||
@ -44,5 +47,8 @@
|
||||
<ClInclude Include="..\..\include\utf.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\threadpool.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
42
src/threadpool.cpp
Normal file
42
src/threadpool.cpp
Normal file
@ -0,0 +1,42 @@
|
||||
#include "threadpool.h"
|
||||
|
||||
threadpool::threadpool() : threadpool(std::thread::hardware_concurrency())
|
||||
{
|
||||
}
|
||||
|
||||
threadpool::threadpool(std::size_t concurrency) : _concurrency(concurrency), _enabled(true)
|
||||
{
|
||||
for (std::size_t i = 0; i < _concurrency; ++i)
|
||||
{
|
||||
_workers.push_back(std::thread(&threadpool::worker_func, this));
|
||||
}
|
||||
}
|
||||
|
||||
threadpool::~threadpool()
|
||||
{
|
||||
_enabled = false;
|
||||
_cv.notify_all();
|
||||
for (std::size_t i = 0; i < _workers.size(); ++i)
|
||||
{
|
||||
_workers[i].join();
|
||||
}
|
||||
}
|
||||
|
||||
void threadpool::worker_func()
|
||||
{
|
||||
while (_enabled)
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(_mutex);
|
||||
_cv.wait(lock, [this] { return (!_queue.empty() || !_enabled); });
|
||||
|
||||
if (_queue.empty() && !_enabled)
|
||||
return;
|
||||
|
||||
auto func = _queue.front();
|
||||
_queue.pop();
|
||||
|
||||
lock.unlock();
|
||||
|
||||
func();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user