C ++ - Пул потоков - PullRequest
       12

C ++ - Пул потоков

0 голосов
/ 06 января 2020

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

1 Ответ

0 голосов
/ 09 января 2020

Я бы предложил попытаться понять реализацию пула потоков в чистом c, например, здесь и здесь , а затем начать использовать c ++ для замены (или в вашем случае реализовать ) части кода c (это может быть библиотечный код, такой как std :: thread, std :: vector, std :: mutex, интеллектуальные указатели или функции языка c ++, такие как ссылки, шаблоны и лямбды).

...