для университетского упражнения я должен был создать пул потоков, используя классы. Я начал работать над этим, но я столкнулся с некоторыми проблемами. Моя идея состояла в том, чтобы использовать ASYN C для генерации потоков, но компилятор сказал мне, что функция, которую я должен был предоставить asyn c, должна была быть функцией stati c. Проблема заключалась в том, что если главной функцией потока была stati c, то каждая переменная должна была быть stati c, и потоки не могли ссылаться на все включенные переменные мьютекса. После некоторых попыток я вышел с этим решением, но я не знаю, хорошо ли продолжать так
class JobScheduler01 {
private:
unsigned int numOfThread;
std::vector<std::future<int>> pool;
//std::vector<std::thread> pool_thread;
std::list<Job> runningQueue;
std::list<Job> waitingQueue;
int ThreadMain(); // <- infinite loop
std::mutex m;
public:
JobScheduler01();
~JobScheduler01();
void Start(); // <- start all the threads
};
void JobScheduler01::Start() {
for(unsigned int i = 0; i < numOfThread; i++){
pool.push_back(std::async([this](){return ThreadMain();})); // <------ QUESTION
}
}
int JobScheduler01::ThreadMain() {
// main loop here
m.lock();
std::cout << "thread: " << std::this_thread::get_id() << "\n";
m.unlock();
return 0;
}
Я создал лямбда-функцию, которая просто запускает основной l oop, но Я не уверен, правильно ли это. Создает ли этот метод каких-то монстров? или это нормально? Что может быть лучшим решением? Лучше использовать asyn c или использовать std :: thread и присоединить их в деструкторе?