首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Timed once标志

Timed once标志
EN

Stack Overflow用户
提问于 2017-04-04 23:56:57
回答 1查看 184关注 0票数 1

我在this answer中看到,我们可以使用std::once_flag来调用一段代码:

代码语言:javascript
复制
std::once_flag onceFlag;

{
    ....
    std::call_once ( onceFlag, [ ]{ /* my code body here runs only once */ } );
    ....
}

在标准中是否有像timed_once_flag这样的东西可以在一段时间后重置,以便代码段可以再次调用?

代码语言:javascript
复制
timed_once_flag timedOnceFlag(5s);

{
    ....
    std::call_once ( timed_once_flag, [ ]{ /* called again after timeout */ } );
    ....
}

我对此进行了搜索,但可能我没有使用适当的搜索词。

编辑:

为什么需要这样:在我的例子中,我有多个线程可以向用户显示MessageBox,所以如果发生错误,它在所有线程中通常是相同的(例如:连接错误),我希望应用程序只显示一次MessageBox,并且将来只可能再次显示一次。

EN

回答 1

Stack Overflow用户

发布于 2017-04-05 00:48:53

onceFlag是这里的关键,它是std::once_flag 的一个对象。

设置了std::once_flag对象的内部状态,这样就不会再次执行std::call_once函数。

如果你注意到了,这些标准只公开了一个构造函数,不带参数 std::once_flag类,没有重载赋值运算符。标准可能声明了私有赋值运算符或使用了“显式删除特殊成员函数。(C++11)”。

据我所知,您无法更改/修改设置的内部状态。

尝试这种奇怪的方式,如果你真的需要....

声明不同的std::once_flag标志

代码语言:javascript
复制
std::once_flag flag1,flag2,flag3; //Three different flags.

    {
        ....
        std::call_once ( flag1, [ ]{ /* my code body here runs only once */ } ); //track first thread call
        std::call_once ( flag2, [ ]{ /* my code body here runs only once */ } ); //track second thread call
        std::call_once ( flag3, [ ]{ /* my code body here runs only once */ } ); //third third thread call

    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43212150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档