这是一段优秀的代码,解决了如何对对象的成员函数使用锁定。
#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;
}
我的问题是,如果构造函数有一个数据成员初始化列表,如何实现它。有可能吗?
答案 0 :(得分:1)
如果Foo
具有数据成员初始化列表,则不需要额外的锁,因为每个线程都有自己的Foo
类实例。 Member initialization list指定直接和虚拟基础子对象和非静态数据成员的初始化程序。
您只需要lock
来控制线程之间共享的状态的一致性。与样本中的静态Foo::x
一样。