【问题标题】:prevent sleep_for from blocking background thread防止 sleep_for 阻塞后台线程
【发布时间】:2018-03-18 06:15:41
【问题描述】:

我正在用纯 c++11 编写,并且想要在关闭它之后执行一个简单的“等待 x 秒并打开一个成员变量”。本例中类的成员变量是“动画”的标志。

        cout << "stop animating!" << endl;
        this->animating = false;

        async(launch::async, [this] ()
        {
            this_thread::sleep_for(chrono::seconds{8});
            this->animating = true;
            std::cout << "start animating!" << std::endl;               
        });
        cout << "i'm here" << endl;

this_thread::sleep_for 会阻止整个程序继续运行(即使它位于异步线程中)。因为 8 秒后我没有看到“我在这里”。如果上面的代码按预期工作,我会在“停止动画”之后立即看到“我在这里”。这种阻塞对我来说是个问题,因为它会锁定我关心的所有内容,比如继续处理键盘事件等“输入”,并且程序还会停止在屏幕上“绘制”其他对象。

有谁知道如何使用标准 c++11 实现成员变量的简单延迟和异步更改(请不要使用 boost 之类的框架)

在 iOS 中非常简单:

// Delay execution of my block for 10 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), 
dispatch_get_main_queue(), ^
{
    //do whatever, 10 seconds later
});

【问题讨论】:

  • 要么改用std::thread([this](){...}).detach();,要么尝试保存结果 std::future 并确保它不会超出范围。
  • 是的。这似乎有效,甚至比跟踪从异步返回的自动未来更好。我想这就是答案
  • 也许看看这个answer。正如 user2176127 提到的,你可以保存 std::future 否则它的析构函数会等待它的结果

标签: c++ c++11 asynchronous thread-sleep


【解决方案1】:

根据@user2176127 的评论 - 你试过这个吗? :

cout << "stop animating!" << endl;
this->animating = false;

std::thread delay_thread(
    [this]() {
        this_thread::sleep_for(chrono::seconds{8});
        this->animating = true;
        std::cout << "start animating!" << std::endl;               
    }
);
delay_thread.detach();
std::cout << "I'm here" << std::endl;

还请注意,您可能需要将animating 成员包装在std::atomic&lt;&gt; 中,即如果它是bool,它现在变为std::atomic&lt;bool&gt;,以确保您的主线程在实际发生更改时注意到更改. (使用 volatile 没有帮助。)

【讨论】:

  • volatile 不是必需的。除非您编写低级代码volatile 几乎总是无用的。如果您想对animating 变量持迂腐态度,请使用std::atomic&lt;bool&gt;
  • 在 C++ 中 volatile 与线程安全无关。虽然它可能会在实践中起作用,但您确实需要 atomic&lt;bool&gt;,否则它就是 UB。
  • 关键字volatile 仅用于内存映射硬件。
  • @user2176127:请注意最近的(易失性 -> 原子)。
  • @JiveDadson:信号处理。
猜你喜欢
  • 2023-03-11
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 2023-03-11
  • 2013-10-05
  • 2020-11-16
相关资源
最近更新 更多