2009-12-29 2 views
12

Сейчас я работаю на небольшой класс-оболочку для повышающего нить, но я действительно не понимаю, как работает функция сна, это то, что у меня до сих пор:Что делает boost :: thread sleep()?

BaseThread::BaseThread(){ 
    thread = boost::thread(); 
    bIsActive = true; 
} 

BaseThread::~BaseThread(){ 
    join(); 
} 

void BaseThread::join(){ 
    thread.join(); 
} 

void BaseThread::sleep(uint32 _msecs){ 
    if(bIsActive) 
     boost::this_thread::sleep(boost::posix_time::milliseconds(_msecs)); 
} 

Это, как я реализовал это до сих пор, но Я действительно не понимаю, как статический метод this_thread :: sleep знает, какой поток спать, если, например, несколько экземпляров моей обертки потока активны. Правильно ли это реализовать?

ответ

17

boost::this_thread::sleep сгорит текущая нить. Только сам поток может заснуть. Если вы хотите сделать поток сна, добавьте контрольный код в поток или use interruptions.

UPDATE: если вы используете компилятор C++ 11 с обновленной стандартной библиотекой, у вас будет доступ к функциям std::this_thread::sleep_for и std::this_thread::sleep_until. Однако нет стандартного механизма прерывания.

+0

контрольный код как какой? перерывы, похоже, тоже хорошие. – user240137

+0

Что я имею в виду под «кодом проверки», так это то, что в коде, выполняемом данным потоком, где-то есть «if», который проверяет, нужно ли ему спать и делать это, если это необходимо. Например, если ваш поток выполняет функцию с большим циклом, то проверка того, нужно ли ему спать (путем проверки булевского набора вашим текущим кодом, например) на каждом конце итерации цикла, может быть достаточно. Но в вашем случае вы не хотите навязывать свой код потока, поэтому перерывы кажутся действительно лучшей альтернативой. – Klaim

2

Сон всегда влияет на текущий поток (тот, который вызывает метод).