Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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++ boost threads-作用域_ptr::reset()是原子操作吗?_C++_Boost Thread - Fatal编程技术网

C++ boost threads-作用域_ptr::reset()是原子操作吗?

C++ boost threads-作用域_ptr::reset()是原子操作吗?,c++,boost-thread,C++,Boost Thread,这是我第一次使用线程,我使用boost。 情况是,我有一个3d多边形网格的大数组,我为其构建了一个八叉树(每个网格一棵树)。 我希望并行执行构建过程,并立即转到openGL显示循环-无需等待构建完成。 (在完成八位字节之前,对象不会显示任何内容) 我使用boost::scoped_ptr::reset()将八叉树数据附加到对象。 在线程执行中,我可以考虑REST()方法为原子操作吗?如果没有,我应该照顾什么 下面是描述我正在做什么的伪代码。 实际代码按预期工作,但我偶尔会遇到崩溃(可能与smth

这是我第一次使用线程,我使用boost。 情况是,我有一个3d多边形网格的大数组,我为其构建了一个八叉树(每个网格一棵树)。 我希望并行执行构建过程,并立即转到openGL显示循环-无需等待构建完成。 (在完成八位字节之前,对象不会显示任何内容)

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

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

类BigData
{
私人:
boost::作用域\u ptr p\u数据\uu;
公众:
void Compute()//这将在线程中运行
{
浮动*p_温度=新浮动[1000];
文件计算(p_temp);
p_data_uu.reset(p_temp);//原子?
}
void运算符(){Compute();}
void Display()//如果p_data_未准备就绪,则不执行任何操作
{
如果(p_数据)
DoDisplay();
}
}
int main()
{
std::矢量对象_arr(1000);
//在线程中运行Compute()

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

定义作用域的ptr时,您不必提及它将存储ptr。这是经过设计的,因此我们可以编写:

     boost::scoped_ptr<float> p_data_;
boost::作用域的ptr p\U数据;
看看你的代码,我觉得你想写:

    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 ... 
}
void Compute()//这将在线程中运行
{
boost::作用域数组p_数据(新浮点[1000]);
docompution(p_data.get());
//无需呼叫重置。。。
}
我用scoped_数组替换scoped_数组,因为如果用new[]分配某个对象,则必须用delete[]释放它,scoped_数组就是这样做的


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

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

1)作用域\u ptr与线程同步无关,顺便说一句,它们不是原子操作。2)你以非常奇怪的方式使用作用域\u ptr。。。。
    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 ... 
}