1. 程式人生 > >STL執行緒安全

STL執行緒安全

想要使用STL時是執行緒安全的,需要自己處理而不是依賴STL的實現。可以手工做同步控制,如下面:

vector<int> v;

...

getMutexFor(v);

vector<int>::iterator first5(find(v.begin(),v.end(),5));

if(first5!=v.end())

{

*first5=0;

}

releaseMutexFor(v);

 

但是這種方法,可能忘了呼叫releaseMutexFor,這樣這個互斥鎖就永遠也不會被釋放。更為面向物件的方法是建立一個Lock類,它在建構函式中獲得一個互斥體,在解構函式中釋放它,從而儘可能減少getMutexFor呼叫,沒有呼叫相應的releaseMutexFor呼叫的可能性。這樣的類(實際上是一個類模板)看起來大概是:

template<typename Container>

class Lock{

public:

Lock(const Container& container ):c(container)

{

getMutexFor(c);

}

~Lock()

{

ReleaseMutexFor(c);

}

private:

const Container& c;

};

 

使用Lock:

vector<int>v;

...

{ //建立新的程式碼塊

Lock<vector<int> >lock(v); //建立互斥體

vector<int>::iterator first5(find(v.begin(),v.end(),5));

if (first5!=v.end())

{

*first5=0;

}

} //程式碼塊結束,自動釋放互斥體

即使不建立新的程式碼塊,在作用域結束,物件自動析構,只不過可能晚一點,但是如果是忘了呼叫releaseMutexFor,則永遠不會釋放互斥體。