让复用变得容易,拒绝重复。
上一节说到,std::mutex并不能完全解决保护数据的问题。存在好几种情况,即使我们已经使用了互斥量,数据还是被破坏了。
- 将被保护数据暴露到互斥量作用域之外
- 被保护数据的访问接口本身就存在竞态条件(条件竞争)
不要暴露你的数据
来看下面例子:
struct protected_data
{
char data[100];
}
class MutexTest
{
public:
template<typename Function>
void process(Function func)
{
std::lock_guard<std::mutex> guard<m_dataMutex>;
func(m_data);
}
private:
std::mutex m_dataMutex;
struct protected_data m_data;
}
struct protected_data *pData;
void inject(Data &data)
{
pData = &data;
}
// 即使process没有显式传出,但是还是被inject传出
// process执行完后,pData能在无锁的情况下访问数据
void Test()
{
process(inject);
for(int i = 0; i < 100; ++i)
{
pData.data[i] = i;
}
}
std::thread mutexTestThread1(Test);
std: