2015-06-04 2 views
0

Я пытаюсь реализовать простой пул потоков в C++ следующим образом:C++ Simple Pool Thread

class worker { 
public: 
    worker(); 
    thread mThread; 
private: 
    void run(); 
}; 

worker::worker() { 
    (this->mThread = thread(&worker::run, this)).detach(); 
} 

class threadpool { 
public: 
    threadpool(int size); 
    void addTask(); 
private: 
    vector<worker> workers; 
}; 

Но когда я добавить конструктор ThreadPool:

threadpool::threadpool(int size) { 
    this->workers = vector<worker>(size, worker()); 
} 

я получаю «попытку ссылаться на удаленную функцию ", которая, насколько я знаю, означает, что где-то в моем коде я пытаюсь скопировать поток. Есть ли способ решить эту проблему?

+0

Закрыть, вы пытались назначить тему. Вы также избегаете использования списков инициализаторов, поэтому вы видите эту ошибку. – StoryTeller

+0

Можете ли вы привести пример того, как сделать все правильно? –

ответ

3

Наименьшее возможное изменение заключается в следующем:

threadpool::threadpool(int size) { 
    this->workers = vector<worker>(size); 
} 

Это говорит, инициализатора списки сладки.

threadpool::threadpool(int size) 
    : workers{size} 
{ } 

(Вы должны переход от int size к size_t или - если вы чувствуете себя праведный - vector<worker>::size_type).

Это было предоставление прототипа объекта worker(), который запросил копирование, неявный конструктор, для которого был удален, поскольку вы предоставили явный конструктор по умолчанию.

+0

Я уже пробовал это, и он дает мне ту же ошибку –

+0

@dchatzis: [здесь] (http://coliru.stacked-crooked.com/a/00a8235a0068803f) он работает - вы используете компилятор, совместимый с C++ 11 ? Имейте в виду, что потоки отсоединены, поэтому может не запускаться до завершения вашей программы - вы, вероятно, хотите 'cin.get()' или что-то заблокировать выход основного потока. –

+0

Я использую vs2013. С списком инициализаторов все в порядке, но первое решение дает ошибку –