Я создаю новый boost::thread
с использованием boost::bind
и сохраняю его в boost::shared_ptr
.
Я передаю функцию и аргумент boost::thread
, но когда поток запускается, он неправильно вызывает конструктор копирования для аргумента функции.
Метод создания потока, который я использую, является очень распространенным паттерном Boost, поэтому я не думаю, что в этом проблема:
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
}
Я пытаюсь скопировать Workflow
из myfunc()
в 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);
}
Кто-нибудь может мне помочь?