c++并发编程中由static类型变量引起的条件竞争问题

来源:互联网 发布:淘宝引流宝怎么设置 编辑:程序博客网 时间:2024/05/18 02:02

如果在并发编程过程中有一个局部变量被声明为static类型,该类型的变量在声明后就已经完成初始化。对于多线程调用的函数,对于该变量就会存在条件竞争:各个线程都认为自己是第一个初始化这个变量的线程;或者一个线程要使用这个变量的时候另外一个线程对该变量还没有初始化完成。

在c++11中可以解决这个问题:将初始化和定义放在一个线程中,并且没有其他线程可在初始化完成之前对其进行处理-使用std::call_once()函数进行处理。


定义于头文件 <mutex>
template< class Function, class... Args > void call_once( std::once_flag& flag, Function&& f, Args&& args... );


功能:执行功能f一次,即使从多个线程调用.

例子:

#include <iostream>#include <thread>#include <mutex> std::once_flag flag;
class my_class;my_class& get_my_class_instance(){    static my_class  instance;//线程安全的初始化过程    return instance;}void do_once(){    std::call_once(flag,get_my_class_instance);} int main(){    std::thread t1(do_once);    std::thread t2(do_once);    std::thread t3(do_once);        t1.join();    t2.join();    t3.join();    }

0 0