Re: Вызов boost::thread.. boost::bind
От: const_volatile  
Дата: 07.05.11 19:02
Оценка:
Здравствуйте, frmbsts, Вы писали:

F>Имеется такая проблема:


F>Есть инстанс класса:

F>worker workInst1(...);

F>Есть функция:


F>void thrManager(worker workerInst)


эта функция принимает аргумент по значению, а не по ссылке. реализована ли у класса worker семантика копирования? если нет, то чтобы избежать подобных ошибок, это следует явно обозначить в его объявлении:
    worker (const worker&) = delete; // если компилятор понимает c++0x
    worker& operator= (const worker&) = delete;
private: worker (const worker&); // в противном случае
    worker& operator= (const worker&);
// а ещё есть boost::noncopyable

соответсвенно, функция thrManager должна принимать ссылку на объект, а не его копию.

F>После создания workInst1 , я зову:

F>boost::thread thr1(boost::bind(thrManager,workInst1));
F>(чуть далее есть thr1.join()

F>И вижу, что вместо создания треда , вызывается worker::~worker (два раза подряд, на втором я получаю segmentation fault), причем на экране не показывается даже "inside thrManager()"


скорее всего, из-за того что не реализован конструктор копирования у worker, в деструкторе дважды делается попытка освободить один ресурс. а собственно сами конструкторы/деструкторы вызываются, потому что аргумент передаётся по значению.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.