C++;线程和自动锁定容器 是否有一种方法自动锁定STL容器在访问上,而不必在它周围锁定和释放? < P>当前的C++标准没有说明STL容器的线程安全性。从官方角度讲,STL实现是线程安全的,但这是非常不寻常的。如果您的STL实现不是线程安全的,那么您需要“围绕它锁定并释放”,或者找到其他方法来协调访问
你可能会对英特尔感兴趣,它包括一些类似于STL容器的线程安全容器。在谷歌搜索了很多之后,似乎可以在容器周围创建一个包装器。e、 g:C++;线程和自动锁定容器 是否有一种方法自动锁定STL容器在访问上,而不必在它周围锁定和释放? < P>当前的C++标准没有说明STL容器的线程安全性。从官方角度讲,STL实现是线程安全的,但这是非常不寻常的。如果您的STL实现不是线程安全的,那么您需要“围绕它锁定并释放”,或者找到其他方法来协调访问,c++,stl,containers,boost-thread,C++,Stl,Containers,Boost Thread,你可能会对英特尔感兴趣,它包括一些类似于STL容器的线程安全容器。在谷歌搜索了很多之后,似乎可以在容器周围创建一个包装器。e、 g: template<typename T> class thread_queue { private: std::queue<T> the_queue; mutable boost::mutex the_mutex; boost::condition_variable the_condition_variable; p
template<typename T>
class thread_queue
{
private:
std::queue<T> the_queue;
mutable boost::mutex the_mutex;
boost::condition_variable the_condition_variable;
public:
void push(T const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
the_queue.push(data);
lock.unlock();
the_condition_variable.notify_one();
}
etc ...
}
模板
类线程队列
{
私人:
std::将_队列排队;
mutable boost::mutex the_mutex;
boost::条件变量\u条件变量;
公众:
无效推送(T常量和数据)
{
boost::mutex::作用域的_锁锁(_互斥锁);
_queue.push(数据);
lock.unlock();
_condition_变量。notify_one();
}
等
}
调用boost::condition\u variable::notify\u one()时,您应该拥有锁。此外,您应该为您的条件变量指定一个适当的名称,如“not\u empty”和“not\u full”,因为这些是线程可能要等待的条件。另一方面,请注意,任何共享资源都是一个争用点,会威胁到应用程序的并行性,因此您最好将其保持在最低限度。我不知道自动实现这一点的方法,这并不是一个真正的问题,因为您通常需要比单个容器的方法更大范围的原子性。例如,您通常希望在插入容器之前在容器中进行搜索。在这种情况下,搜索和插入必须在一个原子块中进行,而不是在两个原子块中进行。另一个“自动锁定”容器不会购买任何东西的领域是在容器中的迭代器上使用STL算法。