Несколько потоков, передавая параметр - PullRequest
0 голосов
/ 20 февраля 2019

Имеет:

  • класс CPU () {};

  • void executetable () {}, внутри CPU;эта функция выполняется потоком.

    void executable(){
      while(run) { // for thread
       cout << "Printing the memory:" << endl;
       for (auto& t : map) {
             cout << t.first << " " << t.second << "\n";
       }
      }
     }
    

Необходимо создать 5 потоков, выполняющих функцию executeable ():

for (int i = 0; i < 5; i++)
    threads.push_back(thread(&CPU::executable, this)); //creating threads


cout << "Synchronizing all threads...\n";
for (auto& th : threads) th.join(); //waits for all of them to finish

Теперь я хочу создать:

 void executable0 () {
     while(run) { 
       cout << "Printing the memory:" << endl;
       for (auto& t : map) {
             cout << t.first << " " << t.second << "\n";
       }
     }
   }

 void executable1 () {....}

to executable4() {....}  // using that five threads that I`ve done above.

Как я мог это сделать? Инициализация или использование конструктора std: thread ?

Может кто-нибудь дать мне пример, чтобы понять этот процесс.Спасибо и всего наилучшего!

1 Ответ

0 голосов
/ 20 февраля 2019

После Комментарий некоторых программистов, чувак , я бы также посоветовал использовать стандартный контейнер std::function:

#include <iostream>
#include <thread>
#include <map>
#include <functional>
#include <vector>

class CPU {
    std::vector<std::function<void()>> executables{};
    std::vector<std::thread> threads{};

public:
    CPU() {
        executables.emplace_back([](){
            std::cout << "executable0\n";
        });
        executables.emplace_back([](){
            std::cout << "executable1\n";
        });
        executables.emplace_back([](){
            std::cout << "executable2\n";
        });
    }

    void create_and_exec_threads() {
        for(const auto executable : executables) {
            threads.emplace_back([=](){ executable(); });
        }

        for(auto& thread : threads) {
            thread.join();
        }
    }
};

Мы создаем vector, содержащий три обратных вызова, которыебудет использоваться для инициализации thread s и запуска их внутри метода create_and_exec_threads.

Обратите внимание, что в отличие от комментария в вашем примере, создается std::thread с обратным вызовом, переданным в его конструкторне только создаст thread, , но также немедленно запустит его .

Кроме того, метод std::thread::join не запускает thread.Он ждет его окончания.

...