【问题标题】:boost threads - is scoped_ptr::reset() an atomic operation?提升线程 - scoped_ptr::reset() 是原子操作吗?
【发布时间】:2014-02-27 21:16:24
【问题描述】:

这是我第一次使用线程,我正在使用 boost。 情况是我有一大堆 3d 多边形网格,为此我构建了一个八叉树(每个网格一棵树)。 我想并行执行构建过程,并立即进入 openGL 显示循环 - 无需等待构建完成。 (对象在八进制完成之前不会显示任何内容)。

我使用 boost::scoped_ptr::reset() 将八叉树数据附加到我的对象。 我可以认为 reset() 方法是线程执行中的原子操作吗?如果不是,我应该照顾什么?

下面是描述我在做什么的伪代码。 实际代码按预期工作,但我偶尔会遇到崩溃(可能与其他有关。)

class BigData
{
private:
    boost::scoped_ptr<float*> p_data_;

public:
    void Compute() // this will run in threads
    {
        float* p_temp = new float [1000];
        DoComputation(p_temp);
        p_data_.reset(p_temp); // atomic ?
    }
    void operator()() {Compute();}

    void Display() // do nothing if p_data_ is not ready
    {
        if(p_data_)
            DoDisplay();
    }
}


int main()
{
    std::vector<BigData>    objects_arr(1000);

    // run Compute() in threads
    for(int i=0; i<objects_arr.size(); ++i)
        boost::thread comp_thread( objects_arr[i] );

    // immediately go to display
    while(true)
    {
        for(int i=0; i<objects_arr.size(); ++i)
            objects_arr[i].Display();
    }

}

【问题讨论】:

  • 1) scoped_ptr 与线程同步无关,顺便说一句,它们不是原子操作。 2)你以非常奇怪的方式使用 scoped_ptr ....

标签: c++ boost-thread


【解决方案1】:

不。这不是 boost::scoped_ptr 的真正问题,而是一般的指针分配问题。

Is pointer assignment atomic in C++?

【讨论】:

    【解决方案2】:

    scoped_array、scoped_ptr、shared_ptr 等类只是 RIIA 模式的不同实现,并不是线程安全的。因此,如果您想在可能发生数据竞争的多线程上下文中使用这些类,您必须自己使用同步原语来保护这些变量

    在定义 scoped_ptr 时,您不必提及它将存储 ptr。这是设计使然,所以我们可以写:

         boost::scoped_ptr<float> p_data_;
    

    看着你的代码,我认为你想写:

        void Compute() // this will run in threads
    {
        boost::scoped_array<float> p_data(new float [1000]);
        DoComputation(p_data.get());
        // no need to call reset ... 
    }
    

    我用 scoped_array 替换了 scoped_array 因为如果你用 new [] 分配一些东西,你必须用 delete [] 释放它,而 scoped_array 这样做!

    我们还可以删除对 reset 的调用,因为 scoped_ .. 类提供的 RIIA 模式通过设计提供了该行为。当标识符超出范围时,资源被释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多