Скажем, у меня есть рабочий поток tWorker
, который инициализируется при построении Boss
и сообщает ему выполнить work()
до тех пор, пока bRetired
не станет истинным. std::mutex
, mtx
блокирует некоторые данные (vFiles
), чтобы tWorker
владел ими, когда он с ними работает.
Как заставить tWorker
"покончить жизнь самоубийством", когда bRetired
станет true
? Как mutex
будет уничтожен, когда поток прекратит выполнение?
Я читал, что std::thread
объекты никоим образом не могут быть прерваны. Дает ли потоку возможность ничего не делать (или вызов std::this_thread::yield()
) тот же эффект, что и уничтожение потока?
class Boss {
private:
std::thread tWorker;
std::mutex mtx;
bool bRetired;
std::vector< std::string > vFiles;
void work() {
while ( bRetired == false ) {
// Do your job!
mtx.lock();
// ... Do something about vFiles ...
mtx.unlock();
}
// tWorker has retired, commit suicide
// ** How? **
// Does this suffice if I want to "kill" the thread?
std::this_thread::yield();
}
public:
Boss() {
bRetired = false;
tWorker = std::thread( &Boss::work, this );
// Have worker do its job independently
// **Bonus Question** : Should this be tWorker.join() or tWorker.detach()?
tWorker.detach();
}
retire() {
bRetired = true;
}
}
Примечания
- Рабочий поток не может быть запущен снова после его вывода из эксплуатации.
- Рабочий поток работает в фоновом режиме, не прерывая выполнение основного потока.