Я работаю с существующей кодовой базой, которая имитирует (простой) планировщик потоков и создает пользовательские потоки с использованием библиотеки 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
}