Kill Boost thread с другим потоком таймаута
Я хочу закончить тему WorkerThread
по истечении определенного времени. Я думал использовать второй поток TimeoutThread
для этого это меняет флаг через 15 секунд, поэтому другой поток останавливается. Есть ли более элегантный способ повысить это?
#include <boost/thread.hpp>
struct MyClass
{
boost::thread timeoutThread;
boost::thread workerThread;
bool btimeout = true;
void run()
{
timeoutThread = boost::thread(boost::bind(&MyClass::TimeoutThread, this));
workerThread = boost::thread(boost::bind(&MyClass::WorkerThread, this));
workerThread.join();
TimeoutThread.join();
}
void WorkerThread() {
while(boost::this_thread::interruption_requested() == false && btimeout)
{
printf(".");
}
}
void TimeoutThread()
{
boost::this_thread::disable_interruption oDisableInterruption;
DWORD nStartTime = GetTickCount();
while(boost::this_thread::interruption_requested() == false)
{
if(GetTickCount() - nStartTime > 15)
{
m_bTimeout = false;
break;
}
}
}
};
int main()
{
MyClass x;
x.run();
}
2 ответа
Вы могли бы использовать сон:
#include <boost/thread.hpp>
struct MyClass
{
boost::thread timeoutThread;
boost::thread workerThread;
void TimeoutThread() {
boost::this_thread::sleep_for(boost::chrono::milliseconds(15));
workerThread.interrupt();
}
void WorkerThread() {
while(!boost::this_thread::interruption_requested())
{
//Do stuff
}
}
void run()
{
timeoutThread = boost::thread(boost::bind(&MyClass::TimeoutThread, this));
workerThread = boost::thread(boost::bind(&MyClass::WorkerThread, this));
workerThread.join();
timeoutThread.join();
}
};
int main()
{
MyClass x;
x.run();
}
Это имеет минимальное преимущество, будучи портативным.
Смотрите это в прямом эфире на Coliru
Пожалуйста, будьте в курсе deadline_timer
класс в Boost Asio тоже.
И похоже, что вы пытаетесь дождаться состояния в вашем рабочем потоке. Если это так, вы также можете ждать condition_variable
с крайним сроком (cv.wait_until
или с таймаутом: cv.wait_for
).
Просто проверьте время в рабочем потоке, и вам не понадобится отдельный поток времени ожидания:
void WorkerThread()
{
DWORD nStartTime = GetTickCount();
while(boost::this_thread::interruption_requested() == false && GetTickCount() - nStartTime < 15000)
{
printf(".");
}
}
Кстати, пожалуйста, обратите внимание 15000
потому что единицы измерения GetTickCount() - это миллисекунды