Добавлен базовый вариант пула потоков

This commit is contained in:
selim 2014-09-14 09:03:40 +04:00
parent f6a6737b99
commit fe20eb715e
4 changed files with 91 additions and 0 deletions

41
include/threadpool.h Normal file
View 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_

View File

@ -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>

View File

@ -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
View 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();
}
}