Вызов boost::thread.. boost::bind
От: frmbsts  
Дата: 07.05.11 17:24
Оценка:
Добрый день.
Имеется такая проблема:

Есть инстанс класса:
worker workInst1(...);

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

void thrManager(worker workerInst)
{
cout << "inside thrManager()" << endl;
workerInst.startWorking();
}

После создания workInst1 , я зову:
boost::thread thr1(boost::bind(thrManager,workInst1));
(чуть далее есть thr1.join();)

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


Чем это может быть вызвано?
Спасибо.
ЗЫ. suse linux, boost 1.42
boost linux bind thread
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, в деструкторе дважды делается попытка освободить один ресурс. а собственно сами конструкторы/деструкторы вызываются, потому что аргумент передаётся по значению.
Re[2]: Вызов boost::thread.. boost::bind
От: frmbsts  
Дата: 07.05.11 20:07
Оценка:
Да. Спасибо.
Стал передавать &workInst1 ( и функция стала получать worker *workerInst) , и заработало.
Re[3]: Вызов boost::thread.. boost::bind
От: jazzer Россия Skype: enerjazzer
Дата: 08.05.11 11:57
Оценка:
Здравствуйте, frmbsts, Вы писали:

F>Да. Спасибо.

F>Стал передавать &workInst1 ( и функция стала получать worker *workerInst) , и заработало.

можно просто boost::ref(workInst1) передавать в boost::bind (или boost::cref если по константной ссылке), тогда не нужно будет все на указатели переводить
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.