我想创建一个线程池。我有一个名为ServerThread.cpp的类,其构造函数应该执行以下操作:
ServerThread::ServerThread()
{
for( int i=0 ; i<init_thr_num ; i++ )
{
//create a pool of threads
//suspend them, they will wake up when requests arrive for them to process
}
}
我想知道在构造函数中创建pthread是否会导致任何应该避免遇到的未定义行为。
由于
答案 0 :(得分:5)
你当然可以在构造函数中做到这一点,但应该注意Scott Meyers在他的有效/更有效的C ++书籍中清楚解释的问题。
简而言之,他的观点是,如果在构造函数中引发任何类型的异常,那么您的半支持对象将不会被销毁。这会导致内存泄漏。所以Meyers的建议是拥有“轻量级”构造函数,然后在完全创建对象后调用的init
方法中执行“繁重”工作。
这个参数与在构造函数中创建pthreads池没有严格的关系(你可能会认为如果你只是创建它们然后立即暂停它们就不会引发异常),但这是一个关于如何做的一般考虑因素在构造函数中(阅读:良好实践)。
要做的另一个考虑因素是构造函数没有返回值。虽然确实(如果没有抛出异常),即使线程创建失败,也可以让对象保持一致状态,从init
或{{{{}} {{}} { 1}}方法。
您还可以阅读有关该主题的this thread on S.O.和this one。
答案 1 :(得分:2)
从严格的形式来看,构造函数实际上只是一个
功能与其他任何功能一样,应该没有任何问题。
实际上,可能存在一个问题:线程实际上可能会启动
在构造函数完成之前运行。如果线程需要一个
完全构造ServerThread
来运作,然后你就进入了
麻烦 - 当ServerThread
是基础时,通常就是这种情况
class,并且线程需要与派生类进行交互。 (这个
是一个非常难以发现的问题,因为最频繁
使用线程调度算法,新线程通常
立即开始执行。)