天天看點

C++11 并發與多線程(二)

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

繼續閱讀