1)线程间共享数据
线程间共享数据的问题
原因:由于修改数据引起,如果都只是读数据,没有任何问题;
竞争条件: 例子:电影院同时买热门电影票,只剩几个位置
**data race** to mean the specific type of race condition that arises because of concurrent modification to a single object
数据竞争同时修改单个对象,导致可怕的未定义行为
1,采用某种保护机制包装数据结构,只有修改的线程才能看到中间状态,而其它线程看不到,
2,免锁程序,比较难 lock-free programming
3,基于transaction的方式,目前没进入标准
2) 用mutex保护数据
保证某个线程修改数据的时候,其它线程要等待
问题:死锁;保护的数据有时太多,有时太少
RAII 方式 std::lock_guard 封装了lock(构造) unlock(析构)
std::lock_guard<std::mutex> guard(someMutex);
口子:如果有的接口返回了***数据的指针或引用***,将可以修改数据
将要保护的数据和锁封装在一个类中
#include <mutex>
class some_data
{
int a;
std::string b;
public:
void do_something()
{}
};
class data_wrapper
{
private:
some_data data;
std::mutex m;
public:
template<typename Function>
void process_data(Function func)
{
std::lock_guard<std::mutex> l(m);
func(data);
}
};
some_data* unprotected;
void malicious_function(some_data& protected_data)
{
unprotected=&protected_data;
}
data_wrapper x;
void foo()
{
x.process_data(malicious_function);
unprotected->do_something(); // 未保护的访问
}
int main()
{
foo();
}
即使数据被保护了,还有可能有竞争条件?
3) 保护数据的其它方法