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,則永遠不會釋放互斥體。