我在this回答中看到,我们可以使用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一次,并且可能在将来再次显示一次。
答案 0 :(得分:1)
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
}