Я пытаюсь изучить std :: threads, std :: mutex и std :: unique_lock.
Идея состоит в том, чтобы создать 5 потоков.
Запросы будут записаны в очередь, и 5 потоков получат запрос из очереди и обработают его.
Если очередь пуста, потоки будут ждать, и это будет продолжаться до тех пор, пока пользователь не введет «Готово»
Код делает чистую компиляцию.
Когда я выполняю это, это вызывает ошибку сегментации при создании потока.
Не могу понять, что я делаю не так с помощью отладчика. Пожалуйста помоги.
#0 0x0000003710e0e45c in _dl_fixup () from /lib64/ld-linux-x86-64.so.2
#1 0x0000003710e14c55 in _dl_runtime_resolve () from /lib64/ld-linux-x86-
64.so.2
#2 0x0000003713ab65a7 in
std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) ()
from /usr/lib64/libstdc++.so.6
#3 0x000000000040247a in std::thread::thread<void (ThreadPool::*)(),
ThreadPool* const> (this=0x7fffffffe3a0, __f=@0x7fffffffe3b0,
__args#0=@0x7fffffffe3a8)
at /usr/lib/gcc/x86_64-redhat-
linux/4.4.7/../../../../include/c++/4.4.7/thread:133
#4 0x0000000000401f1c in ThreadPool::createthreads (this=0x7fffffffe3f0,
count=5) at ThreadPool.cpp:73
#5 0x00000000004016e4 in main () at ThreadPool.cpp:99
Вот полный код
#include <queue>
#include <string>
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
#include <condition_variable>
using namespace std;
void handler(string req, int s)
{
cout << "Process request " << req << " by thread " <<
this_thread::get_id()<<endl;;
}
class ThreadPool
{
vector<thread> threadlist;
queue<pair<string, int> > requestQueue;
mutex qLock;
condition_variable queued;
volatile bool breakout;
void (*callback)(string,int);
public:
ThreadPool()
{
breakout=false;
}
void setcallback(void (*fp)(string, int))
{
callback=fp;
}void worker()
{
while (!breakout)
{
pair<string, int> request;
{
unique_lock<mutex> lock(qLock);
while((!breakout) && (requestQueue.empty()))
{
queued.wait(lock);
}
if (!requestQueue.empty())
{
request = requestQueue.front();
requestQueue.pop();
}
}
if (!request.first.empty())
{
callback(request.first,request.second);
}
}
}
void createthreads(int count)
{
for (int i=0;i<count;i++)
{
threadlist.push_back(thread(&ThreadPool::worker,this));
}
}};int main()
{
ThreadPool tp;
tp.setcallback(handler);
tp.createthreads(5);
return(0);
}
Задача ещё не решена.
Других решений пока нет …