Добавлен базовый вариант пула потоков
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>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\logger.cpp" />
|
<ClCompile Include="..\..\src\logger.cpp" />
|
||||||
<ClCompile Include="..\..\src\log_queue.cpp" />
|
<ClCompile Include="..\..\src\log_queue.cpp" />
|
||||||
|
<ClCompile Include="..\..\src\threadpool.cpp" />
|
||||||
<ClCompile Include="..\..\src\ustring.cpp" />
|
<ClCompile Include="..\..\src\ustring.cpp" />
|
||||||
<ClCompile Include="..\..\src\utf.cpp" />
|
<ClCompile Include="..\..\src\utf.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\include\logger.h" />
|
<ClInclude Include="..\..\include\logger.h" />
|
||||||
<ClInclude Include="..\..\include\log_queue.h" />
|
<ClInclude Include="..\..\include\log_queue.h" />
|
||||||
|
<ClInclude Include="..\..\include\threadpool.h" />
|
||||||
<ClInclude Include="..\..\include\ustring.h" />
|
<ClInclude Include="..\..\include\ustring.h" />
|
||||||
<ClInclude Include="..\..\include\utf.h" />
|
<ClInclude Include="..\..\include\utf.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@ -30,6 +30,9 @@
|
|||||||
<ClCompile Include="..\..\src\utf.cpp">
|
<ClCompile Include="..\..\src\utf.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\threadpool.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\include\log_queue.h">
|
<ClInclude Include="..\..\include\log_queue.h">
|
||||||
@ -44,5 +47,8 @@
|
|||||||
<ClInclude Include="..\..\include\utf.h">
|
<ClInclude Include="..\..\include\utf.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\threadpool.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</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