gpt4 book ai didi

c++ - 终止在无限循环中运行的 std::thread

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:04 25 4
gpt4 key购买 nike

如何在 Bar 的析构函数中终止我的分离线程(而不必等到线程从 sleep 中醒来)?

class Bar {

public:

Bar() : thread(&Bar:foo, this) {
}

~Bar() { // terminate thread here}



...

void foo() {
while (true) {
std::this_thread::sleep_for(
std::chrono::seconds(LONG_PERIOD));

//do stuff//
}

}

private:
std::thread thread;

};

最佳答案

你可以使用 std::condition_variable :

class Bar {
public:
Bar() : t_(&Bar::foo, this) { }
~Bar() {
{
// Lock mutex to avoid race condition (see Mark B comment).
std::unique_lock<std::mutex> lk(m_);
// Update keep_ and notify the thread.
keep_ = false;
} // Unlock the mutex (see std::unique_lock)
cv_.notify_one();
t_.join(); // Wait for the thread to finish
}

void foo() {
std::unique_lock<std::mutex> lk(m_);
while (keep_) {
if (cv_.wait_for(lk, LONG_PERIOD) == std::cv_status::no_timeout) {
continue; // On notify, just continue (keep_ is updated).
}
// Do whatever the thread needs to do...
}
}

private:
bool keep_{true};
std::thread t_;
std::mutex m_;
std::condition_variable cv_;
};

这应该让您全面了解您可以做什么:

  • 您使用 bool 来控制循环(使用 std::mutex 进行 protected 读写访问);
  • 您使用 std::condition_variable 唤醒线程以避免等待 LONG_PERIOD

关于c++ - 终止在无限循环中运行的 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40162902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com