2016-05-03 3 views
-2

У меня есть массив потоков и в цикле for Я должен создать поток для всех из них.Возьмите несколько аргументов функции потока C++ 11

Проблема в том, что один из параметров: std::move(promise_var), а другой - структура. Когда я пытаюсь скомпилировать его компиляции дает мне ошибку:

error: no matching function for call to ‘ std::thread::thread(void (&)(Function), Structure [nNumThreads], std::remove_reference<std::promise<const char*>&>::type)

Итак, вот упрощенная версия кода ...

func(struct Structure, std::promise<const char *> && v_Promise){ 
//doing work 
} 

main(){ 
std::thread a_Threads[5]; 

for(int8_t i = 0; i < 5; i++){ 
    a_Threads[i] = std::threads(func, Structure, std::move(v_promise[i])); 
} 
} 
+0

Я не уверен, что вы можете делать то, что хотите, но я не думаю, что хочу в любом случае. В цикле вы перемещаете один и тот же объект в каждый поток. После первой итерации 'v_promise' больше не будет использоваться, поскольку ее содержимое было перемещено в поток. – NathanOliver

+1

Если 'func' принимает ссылку rvalue на' std :: prom', это означает, что он, вероятно, «переходит из« v_promise »и оставляет' v_promise' в неуказанном, возможно непригодном состоянии. Как каждый поток может использовать один и тот же объект в этом случае? Либо создайте 5 'v_promise', либо используйте ссылку lvalue. – KABoissonneault

+0

. Конечно, вы можете использовать многопоточные функции потоковой передачи. Однако в коде есть проблема, упомянутая выше, и она не является полной в любом случае. – SergeyA

ответ

2

(не вкладывая в комментарии, так что я могу присоединить код правильно) я закончил код, представленный таким образом, чтобы он компилирует и я могу подтвердить, что приведенный ниже код компилируется и работает нормально с командой g++ test.cpp -std=c++11 -pthread:

#include <iostream> 
#include <thread> 
#include <future> 

using namespace std; 

struct Structure{ 
int el1; 
int el2; 
}; 

void func(struct Structure, std::promise<const char *> && v_Promise){ 
    cout<<"Hello"<<endl; 
    //doing work 

} 

int main(){ 
    std::thread a_Threads[5]; 
    Structure my_struct; 
    std::promise<const char*> v_promise; 

    for(int8_t i = 0; i < 5; i++){ 

     a_Threads[i] = std::thread(func, my_struct, std::move(v_promise)); 

    } 
} 

Пожалуйста перекрестных ссылок это против любые опечатки или информацию, которую вы могли бы опустить.

+0

Этот код отлично работал на вашей машине? –

+0

Да, используя как clang ++ (3.8), так и g ++ (4.9), он печатает привет несколько раз. – nikaza

+0

Вы уверены, что func объявлен как void? – nikaza

Смежные вопросы