После Комментарий некоторых программистов, чувак , я бы также посоветовал использовать стандартный контейнер 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
.Он ждет его окончания.