Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;线程和自动锁定容器 是否有一种方法自动锁定STL容器在访问上,而不必在它周围锁定和释放? < P>当前的C++标准没有说明STL容器的线程安全性。从官方角度讲,STL实现是线程安全的,但这是非常不寻常的。如果您的STL实现不是线程安全的,那么您需要“围绕它锁定并释放”,或者找到其他方法来协调访问_C++_Stl_Containers_Boost Thread - Fatal编程技术网

C++;线程和自动锁定容器 是否有一种方法自动锁定STL容器在访问上,而不必在它周围锁定和释放? < P>当前的C++标准没有说明STL容器的线程安全性。从官方角度讲,STL实现是线程安全的,但这是非常不寻常的。如果您的STL实现不是线程安全的,那么您需要“围绕它锁定并释放”,或者找到其他方法来协调访问

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

你可能会对英特尔感兴趣,它包括一些类似于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;
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算法。