Здравствуйте, 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, в деструкторе дважды делается попытка освободить один ресурс. а собственно сами конструкторы/деструкторы вызываются, потому что аргумент передаётся по значению.