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,则永远不会释放互斥体。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值