Скажем, у меня есть рабочий поток 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;
}
}
Примечания
- Рабочий поток не может быть запущен снова после его выхода на пенсию.
- Рабочий поток работает на фоне без прерывания выполнения основного потока.