Ошибка сегментации при выполнении метода-члена из потока

Я пытаюсь изучить 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);
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]