Boost.Thread: зачем использовать несколько потоков повышения для планирования одного пользовательского потока? - PullRequest
0 голосов
/ 24 марта 2019

Я работаю с существующей кодовой базой, которая имитирует (простой) планировщик потоков и создает пользовательские потоки с использованием библиотеки Boost.Thread.

Я смущен выбором дизайна от предыдущего разработчика (который недоступен для меня). Для каждого нового пользовательского потока создается объект ThrObjWrapper; этот объект ThrObjWrapper содержит 4 ускоряющих потока:

  • thrRun
  • thrSuspend
  • thrResume
  • thrSleep

Всякий раз, когда планировщик потока (ThrScheduler) возобновляет или приостанавливает работу ThrObjWrapper, ThrObjWrapper выполняет операции с 2 из этих потоков (которые зависят от того, возобновляет ли планировщик потоки или приостанавливает потоки).

Я не могу понять, почему так много потоков необходимо. Разве не может быть достаточно одного потока повышения? Я мог даже понять две темы, но четыре? Почему четыре?

Это цикл выполнения ThrScheduler:

// curr = the current ThrObjWrapper instance being run by the ThrScheduler

if (curr != NULL) {
    if (curr->isThrRunning()) {

        if (curr->isThrSuspended())
            curr->thrResume();

    } else {
        curr->run();
    }
}

this->sleepScheduler();

if (curr != NULL && curr->isThrRunning()) {
    curr->thrSuspend();
}

Это класс ThrObjWrapper (мьютексы, условные переменные, методы получения / установки и т. Д. Были удалены для краткости):

class ThrObjWrapper {
    protected:
    bool suspended;

        boost::thread thrRun;
        boost::thread thrSuspend;
        boost::thread thrResume;
        boost::thread thrSleep;
};

void ThrObjWrapper::thrSuspendFunc() {
    this->thrSuspend.interrupt();
    this->thrResume.join();
    this->suspended = true;

    while (this->suspended) {
        this->thrRun.yield();
    }
}

void ThrObjWrapper::thrSuspend() {
    this->thrSleep = boost::thread(&ThrObjWrapper::thrSuspendFunc, this);
}

void ThrObjWrapper::thrResumeFunc() {
    this->thrResume.interrupt();
    this->suspended = false;
    this->thrSleep.join();
}

void ThrObjWrapper::thrResume() {
    this->thrResume = boost::thread(&ThrObjWrapper::thrResumeFunc, this);
}

bool ThreadClass::isThrSuspended() {
    return this->suspended;
}

bool ThrObjWrapper::isThrRunning() {
    return thrRun.joinable();
}

void ThrObjWrapper::thrSleep(int time) {
    this->thrRun.sleep(boost::get_system_time() + boost::posix_time::milliseconds(time));
}

void ThrObjWrapper::run() {
    this->thrRun = boost::thread(&ThrObjWrapper::thrOperation, this);
}

void ThrObjWrapper::thrOperation() {
    // Performs some operation
}
...