STL线程安全

来源:互联网 发布:有钱人的生活知乎 编辑:程序博客网 时间:2024/06/03 21:58
想要使用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,则永远不会释放互斥体。

0 0
原创粉丝点击