我在this answer中看到,我们可以使用std::once_flag来调用一段代码:
std::once_flag onceFlag;
{
....
std::call_once ( onceFlag, [ ]{ /* my code body here runs only once */ } );
....
}在标准中是否有像timed_once_flag这样的东西可以在一段时间后重置,以便代码段可以再次调用?
timed_once_flag timedOnceFlag(5s);
{
....
std::call_once ( timed_once_flag, [ ]{ /* called again after timeout */ } );
....
}我对此进行了搜索,但可能我没有使用适当的搜索词。
编辑:
为什么需要这样:在我的例子中,我有多个线程可以向用户显示MessageBox,所以如果发生错误,它在所有线程中通常是相同的(例如:连接错误),我希望应用程序只显示一次MessageBox,并且将来只可能再次显示一次。
发布于 2017-04-05 00:48:53
onceFlag是这里的关键,它是std::once_flag 类的一个对象。
设置了std::once_flag对象的内部状态,这样就不会再次执行std::call_once函数。
如果你注意到了,这些标准只公开了一个构造函数,不带参数 std::once_flag类,没有重载赋值运算符。标准可能声明了私有赋值运算符或使用了“显式删除特殊成员函数。(C++11)”。
据我所知,您无法更改/修改设置的内部状态。
尝试这种奇怪的方式,如果你真的需要....
声明不同的std::once_flag标志
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
}https://stackoverflow.com/questions/43212150
复制相似问题