Как избежать разрушения и воссоздания потоков внутри l oop? - PullRequest
2 голосов
/ 28 марта 2020

У меня есть al oop, который создает и использует два потока. Потоки всегда делают одно и то же, и мне интересно, как их можно использовать повторно, а не создавать и уничтожать каждую итерацию? Некоторые другие операции выполняются внутри l oop, которые влияют на данные, обрабатываемые потоками. Вот упрощенный пример:

const int args1 = foo1();
const int args2 = foo2();
vector<string> myVec = populateVector();
int a = 1;
while(int i = 0; i < 100; i++)
{
    auto func = [&](const vector<string> vec){
        //do stuff involving variable a
        foo3(myVec[a]);
    }
    thread t1(func, args1);
    thread t2(func, args2);
    t1.join();
    t2.join();

    a = 2 * a;
}

Можно ли перезапустить t1 и t2? Есть шаблон дизайна, который я должен изучить? Я спрашиваю, потому что добавление потоков сделало программу немного медленнее, когда я думал, что это будет быстрее.

1 Ответ

1 голос
/ 28 марта 2020

Вы можете использовать std::async, как предлагается в комментариях.

То, что вы также пытаетесь сделать, является очень распространенным использованием для Threadpool. Я использую простую реализацию заголовка, которую я обычно использую: здесь

Чтобы использовать эту библиотеку, создайте пул за пределами l oop с количеством потоков, установленных во время построения. Затем enqueue функция, в которой поток go отключается и выполняется. С этой библиотекой вы получите std::future (очень похоже на шаги std :: asyn c), и это то, что вы бы wait включили в ваш l oop.

Как правило, вы хотели бы сделать доступ к любым поточно-ориентированным данным с мьютексами (или другими способами, есть много способов сделать это), но с очень точным c ситуации вам не понадобятся.

В этом случае

  1. , пока вектор не увеличивается в размере (не нужно перераспределять)
  2. Только чтение элементов или только изменяя каждый элемент в отдельном потоке

, вам не нужно беспокоиться о синхронизации.

Хотя в любом случае это просто хорошая привычка делать syn c. .. Когда другие люди в конечном итоге изменят код, они не будут знать ваши правила и вызовут проблемы.

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