如何锁定使用带有初始化列表的构造函数的类的成员函数

时间:2016-11-22 21:23:24

标签: c++ multithreading

这是一段优秀的代码,解决了如何对对象的成员函数使用锁定。

 #include <thread>
 #include <mutex>
 #include <iostream>

 class Foo
 {
 public:
      void increment()
      {
         for ( int i = 0; i < 10000000; ++i )
         {
             std::lock_guard<std::mutex> lock(mtx); //lock mtx
              ++x;

             // mtx is automatically released when lock
             // goes out of scope -> RAII
         }
     }

     void decrement()
     {
           for ( int i = 0; i < 10000000; ++i )
           {
               std::lock_guard<std::mutex> lock(mtx); //lock mtx
               --x;

              // mtx is automatically released when lock
              // goes out of scope -> RAII
          }
        }

        static int x;
        static std::mutex mtx;
  };

   int Foo::x = 0;
   std::mutex Foo::mtx;

   int main()
   {
       std::thread t1(&Foo::increment, Foo());
       std::thread t2(&Foo::decrement, Foo());

       t1.join();
       t2.join();

       std::cout << Foo::x;
    }

我的问题是,如果构造函数有一个数据成员初始化列表,如何实现它。有可能吗?

1 个答案:

答案 0 :(得分:1)

如果Foo具有数据成员初始化列表,则不需要额外的锁,因为每个线程都有自己的Foo类实例。 Member initialization list指定直接和虚拟基础子对象和非静态数据成员的初始化程序。

您只需要lock来控制线程之间共享的状态的一致性。与样本中的静态Foo::x一样。