Вектор C ++ push_back (): не могу понять заклинание для создания неназванных переменных потока - PullRequest
0 голосов
/ 07 января 2020

Создание именованного потока работает хорошо для меня:

void inserter( int iTimes ) {
  for ( int i = 0; i < iTimes; i++ )
      DoOne();
}

int main( int nArg, const char* apszArg[] ) {
  std::thread t1( inserter, 100 );
      :
      :

Но я не могу понять, как это сделать при создании потоков без имени. Это приводит к ошибке, что он не может разрешить конструктор. Мне также интересно, будет ли когда-то работать, будет ли тип вектора правильным типом или вместо thread* мне нужно указать аргументы шаблона и если да, то как это сделать для 1) функции и 2) список параметров.

using namespace std;
vector<thread*> apthread;

for ( int i = 0; i < nThreads; i++ )
    apthread.push_back( new thread( inserter, i ) );

Ответы [ 2 ]

4 голосов
/ 07 января 2020

Единственное, что явно отсутствует в вашем примере кода для его компиляции, это std::: https://godbolt.org/z/3gX_h2

#include <thread>
#include <vector>

void DoOne(){}

void DoMany( int iTimes ) {
    for ( int i = 0; i < iTimes; i++ )
        DoOne();
}

int main(){
    std::vector<std::thread*> apthread;

    const auto nThreads=10;

    for ( int i = 0; i < nThreads; i++ )
        apthread.push_back( new std::thread( DoMany, i ) ); 

    // join all the threads
    for(auto& t: apthread){
        t->join();
    }

}

Однако вы никогда не должны использовать обычный new, и в любом случае нет необходимости использовать динамическое c выделение для std::thread: это уже дескриптор, и вы можете просто push_back новый объект потока в векторе:

#include <thread>
#include <vector>

void DoOne(){}

void DoMany( int iTimes ) {
    for ( int i = 0; i < iTimes; i++ )
        DoOne();
}

int main(){
    std::vector<std::thread> apthread;

    const auto nThreads=10;

    for ( int i = 0; i < nThreads; i++ )
        apthread.push_back(std::thread( DoMany, i ) );    

    // join all the threads
    for(auto& t: apthread){
        t.join();
    }
}
0 голосов
/ 08 января 2020

Проблема не связана с вектором потоков.

Вместо этого проблема заключается в том, что функция потока называется inserter(), что также является символом, определенным библиотеками C ++ std.

В векторную версию, кроме добавления вектора, добавлено using namespace std;, что помешало компилятору (g ++ 7.2.1) разрешить намерение.

Изменение имени функции практически на что-либо другое (не определяется стандартные библиотеки) включает компиляцию. Аналогично, удаление using namespace std; и взамен явного добавления всех символов библиотеки к std:: работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...