2014-09-26 4 views
1

этот код не компилировать:станд :: forward_list.push_front (станд :: нить) не компилировать

декларация Класс:

class threadController 
{ 
private: 
    static std::forward_list<std::thread> threadList; 
    static std::mutex      mutexThreadList; 

public: 
    static void startAndAddThreadToList(int argc, char * argv []); 

}; 

Определение класса:

std::forward_list<std::thread> threadController::threadList; 
std::mutex      threadController::mutexThreadList; 

void threadController::startAndAddThreadToList(int argc, char * argv []) 
{ 
    // execute now the thread to avoid a delayed start because of the mutex lock 
    std::thread threadInstance(threadCalculateOneInstrument, argc, argv); 

    mutexThreadList.lock(); 
    threadList.push_front(threadInstance); 
    mutexThreadList.unlock(); 
} 

Это ошибка компилятора:

/usr/local/include/c++/4.9.1/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = std::thread; _Args = {const std::thread&}; _Tp = std::thread]’: 
/usr/local/include/c++/4.9.1/bits/alloc_traits.h:253:4: required from ‘static std::_Require<typename std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::type> std::allocator_traits<_Alloc>::_S_construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = std::thread; _Args = {const std::thread&}; _Alloc = std::allocator<std::thread>; std::_Require<typename std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::type> = void]’ 
/usr/local/include/c++/4.9.1/bits/alloc_traits.h:399:57: required from ‘static decltype (_S_construct(__a, __p, (forward<_Args>)(std::allocator_traits::construct::__args)...)) std::allocator_traits<_Alloc>::construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = std::thread; _Args = {const std::thread&}; _Alloc = std::allocator<std::thread>; decltype (_S_construct(__a, __p, (forward<_Args>)(std::allocator_traits::construct::__args)...)) = <type error>]’ 
/usr/local/include/c++/4.9.1/bits/forward_list.h:357:42: required from ‘std::_Fwd_list_base<_Tp, _Alloc>::_Node* std::_Fwd_list_base<_Tp, _Alloc>::_M_create_node(_Args&& ...) [with _Args = {const std::thread&}; _Tp = std::thread; _Alloc = std::allocator<std::thread>; std::_Fwd_list_base<_Tp, _Alloc>::_Node = std::_Fwd_list_node<std::thread>]’ 
/usr/local/include/c++/4.9.1/bits/forward_list.tcc:71:64: required from ‘std::_Fwd_list_node_base* std::_Fwd_list_base<_Tp, _Alloc>::_M_insert_after(std::_Fwd_list_base<_Tp, _Alloc>::const_iterator, _Args&& ...) [with _Args = {const std::thread&}; _Tp = std::thread; _Alloc = std::allocator<std::thread>; std::_Fwd_list_base<_Tp, _Alloc>::const_iterator = std::_Fwd_list_const_iterator<std::thread>]’ 
/usr/local/include/c++/4.9.1/bits/forward_list.h:803:9: required from ‘void std::forward_list<_Tp, _Alloc>::push_front(const _Tp&) [with _Tp = std::thread; _Alloc = std::allocator<std::thread>]’ 
../source/threadController.cpp:27:38: required from here 
/usr/local/include/c++/4.9.1/ext/new_allocator.h:120:4: error: use of deleted function ‘std::thread::thread(const std::thread&)’ 

Мое намерение состоит в том, чтобы реализовать список потоков. Потоки выполняются с неопределенным временем выполнения. Поток «control» проверяет каждые 10 секунд потоки в списке. Если поток завершен, то для освобождения ресурсов вызывается функция threaddetach().

ответ

8

Не разрешается копировать std::thread объекты, вы можете использовать emplace так:

threadList.emplace_front(threadCalculateOneInstrument, argc, argv); 

См:std::forward_list::emplace_front().

+0

+1 для меня учить что-то новое сегодня «устанавливать» - «избежать копирования constrct» – Soren

+0

Спасибо - это работает! Следующий код передает компилятор; можете ли вы подтвердить, что он также работает: \t 'std :: thread threadInstance (threadCalculateOneInstrument, argc, argv); \t std :: thread * threadPtr = & threadInstance; \t mutexThreadList.lock(); \t threadList.push_front (threadPtr); 'член должен быть изменен на

+1

@AlBundy, в этом случае вы должны динамически создать поток:' std :: thread * threadPtr = new std: thread (. ..) 'иначе вы создаете указатель на локальную переменную, которая будет уничтожена после возврата функции. –

1

std::threads не копируемый, вы можете использовать либо emplace_front() как предложено Galik, или вставить rvalues ​​(в этом случае двигаться конструктор будет вызываться):

threadList.push_front(std::thread(threadCalculateOneInstrument, argc, argv)); 

Это может быть полезно, если у вас есть функция, которая возвращает std::thread, так emplace_front() не применяется:

std::thread createThread() {....} 
threadList.push_front(createThread()); 
Смежные вопросы