编辑:我需要重构这个问题,它有太多无关的组件要清楚我的问题(关于C ++)是什么。但任何能够理解我要问的人都应该回答。
我有一个代表线程的类。我正在使用的线程库TinyThread ++通过创建一个thread
对象来启动一个线程,但是它没有复制构造函数。这有道理..复制线程的意义究竟是什么?
以前我一直用这种方式初始化我的线程对象E_thread
:
class E_thread {
E_threadRoutine m_routine;
E_thread *m_parent;
thread m_thread;
public:
E_thread(void *(void*),void*,E_thread*);
};
E_thread::E_thread(void *func(void*), void *arg, E_thread* parent):
m_parent(parent), m_routine(func,arg),
m_thread(thread_function_common, &m_routine)
{}
以这种方式初始化thread
ctor,我将E_thread
的{{1}}成员的指针作为其参数发送给线程。 m_routine
的目的是跟踪线程特定的功能以传递给线程本身。
但是现在我想更改一下我想要更仔细地分配m_routine
的地方。现在m_routine
是一个指针,我需要用
m_routine
在m_routine = new E_threadRoutineTypeX(func,arg,etc);
ctor中。但这意味着我不能再像以前那样初始化E_thread
。我试过把
thread
在正文中但这会复制我不想做的线程对象。这样做有一些语法......
答案 0 :(得分:1)
您可以执行以下操作:使用函数初始化m_routine,这将返回一个新的E_threadRoutine,如此 -
m_routine(createThreadRoutine(func, arg))
并让createThreadRoutine以您想要的方式返回一个新的E_threadRoutine。然后,您可以使用(thread_function_common,m_routine)初始化m_thread。 createThreadRoutine的使用不是强制性的,但如果需要的话,它可以让你做的不仅仅是new
。
为此,m_routine必须出现在类中的m_thread之前,否则m_thread将在m_routine设置之前初始化。请参阅Constructor initialization-list evaluation order。
答案 1 :(得分:1)
class E_thread {
E_threadRoutine* m_routine;
E_thread *m_parent;
thread m_thread;
public:
E_thread(void *(void*),void*,E_thread*);
};
E_thread::E_thread(void *func(void*), void *arg, E_thread* parent) :
m_routine(new E_threadRoutineTypeX(func,arg,etc)),
m_parent(parent),
m_thread(thread_function_common, m_routine)
{}
我也改变了你的成员初始化顺序,它应该总是按照成员在类中出现的顺序出现,以避免错误。