這是我第一次使用線程,並且我正在使用boost。 情況是,我有一個三維多邊形網格的大陣列,爲此我構建了一個八叉樹(每個網格一棵樹)。 我想要並行執行構建過程,並立即轉到openGL顯示循環 - 無需等待構建完成。 (該對象根本不會顯示任何東西,直到它的八度完成)。boost線程 - 是scoped_ptr :: reset()一個原子操作?
我使用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與線程同步沒有關係,btw也不是原子操作。和2)你使用scoped_ptr以非常奇怪的方式.... – alexbuisson