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) 保護資料的其它方法