2010-12-05 50 views
1

我使用boost::bind創建新的boost::thread,並將其存儲在boost::shared_ptr中。
我正在向boost::thread傳遞一個函數和參數,但是當線程啓動時,它沒有正確地調用函數參數的拷貝構造函數。將boost :: bind,boost :: shared_ptr和boost :: thread一起使用時未複製的構造函數

我使用的線程的創建方法是一種很常見的升壓模式,所以我不認爲這是問題的所在:

void myclass::myfunc() { 
    Workflow wfOriginal; 
    boost::shared_ptr<boost::thread>(
     new boost::thread(boost::bind(&myclass::anotherfunc, this, wfOriginal))); 
} 
// ... 
void myclass::anotherfunc(Workflow wfCopied) { 
    // Doing something 
} 

我想給Workflowmyfunc()複製到anotherfunc()
Workflow包含一個集合,所以我提供了一個複製構造函數,將現有集合中的元素複製到新的Workflow

不幸的是,當新線程調用anotherfunc()時,wfCopied內部的集合爲空!
我可以告訴Workflow對象被部分複製,因爲像字符串和整數等其他成員已被複制,但集合中的元素沒有。

我已驗證了拷貝構造函數通過使用此代碼測試是否能夠正常工作:

Workflow wf; 
// ... insert some elements into wf... 
Workflow wf1 = wf; 
// wf1 has the same elements 

我想強調的是,我的測試表明我Workflow的拷貝構造函數工作正常。
但爲了完整起見,這裏是Workflow拷貝構造函數:

Workflow::Workflow(const Workflow& workflow) { 
    this->_id = workflow._id; 
    (this->_tasks).clear(); 
    Workflow::TaskCollectionConstIterator it; 
    for (it = (this->_tasks).begin(); it < (this->_tasks).end(); it++) 
     (this->_tasks).push_back(*it); 
} 

誰能幫助我?

+0

這是你的真實密碼?使用`wf`作爲`myclass :: anotherFunc`上的參數名和作爲類成員似乎是可疑的。 – 2010-12-05 22:02:08

回答

2

看來你的拷貝構造函數是有缺陷的。您正在從空載體複製到您的載體。這導致沒有任何內容被複制。

我想你的意思:

for (it = (workflow->_tasks).begin(); it < (workflow->_tasks).end(); it++) 
    (this->_tasks).push_back(*it); 
+0

你是對的...但沒有什麼變化... – Andry 2010-12-05 21:55:32

0

你知道初始化列表是什麼構造?爲什麼你在構造函數中清除容器?

Workflow::Workflow(const Workflow& workflow): _id(workflow._id), 
    _tasks(workflow._tasks.begin(), workflow._tasks.end()) 
{} 
相關問題