【问题标题】:C++ boost::thread and automatically locking containersC++ boost::thread 和自动锁定容器
【发布时间】:2010-12-11 12:17:36
【问题描述】:

有没有办法在访问时自动锁定 STL 容器,而无需在其周围锁定和释放?

【问题讨论】:

  • 另一方面,请注意,任何共享资源都是威胁应用程序并行性的争用点,因此您最好将其保持在最低限度。
  • 我不知道自动执行此操作的方法,这并不是真正的问题,因为您经常需要比单个容器的方法更广泛的原子性。例如,您通常希望在插入容器之前先在容器中进行搜索。在这种情况下,搜索和插入必须在一个原子块中进行,而不是两个。另一个“自动锁定”容器不会买任何东西的领域是在该容器中的迭代器上使用 STL 算法。

标签: c++ stl containers boost-thread


【解决方案1】:

当前的 C++ 标准没有说明 STL 容器的线程安全。正式地,STL 实现可能是线程安全的,但这是非常不寻常的。如果您的 STL 实现不是线程安全的,那么您将需要“锁定和释放它”或找到其他方式来协调访问。

您可能对 Intel 的 Threading Building Blocks 感兴趣,其中包括一些类似于 STL 容器的线程安全容器。

【讨论】:

    【解决方案2】:

    经过多次谷歌搜索,似乎方法是在容器周围创建一个包装器。例如:

    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 ...
    }
    

    【讨论】:

    • 当你调用 boost::condition_variable::notify_one() 时你应该拥有锁
    • 另外,你应该给你的条件变量一个合适的名字,比如“not_empty”和“not_full”,因为这些是线程可能想要等待的条件。
    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多