void call_once( std::once_flag& flag, Callable&& f, Args&&... args );
就是保证函数或者一些代码段在并发或者多线程的情况下,始终只会被执行一次。
准确执行一次可调用 (Callable) 对象 f ,即使同时从多个线程调用。
细节为:若在调用 call_once 的时刻, flag 指示已经调用了 f ,则 call_once 立即返回(称这种对 call_once 的调用为消极)。
否则, call_once 以参数 std​::​forward<args>(args)... 调用 ​std​::​forward<callable>(f) (如同用 std::invoke )。不同于 std::thread 构造函数或 std::async ,不移动或复制参数,因为不需要转移它们到另一执行线程(称这种对 call_once 的调用为积极)。
若该调用抛异常,则传播异常给 call_once 的调用方,并且不翻转 flag ,以令其他调用将得到尝试(这种对 call_once 的调用被称为异常)。
若该调用正常返回(这种对 call_once 的调用被称为返回),则翻转 flag ,并保证以同一 flag 对 call_once 的其他调用为消极。
同一 flag 上的所有积极调用组成单独全序,它们由零或多个异常调用后随一个返回调用组成。该顺序中,每个积极调用的结尾同步于下个积极调用。
从返回调用的返回同步于同一flag上的所有消极调用:这表示保证所有对 call_once 的同时调用都观察到积极调用所做的任何副效应,而无需额外同步。</callable></args>