【发布时间】: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