2

我想创建一个线程池。我有一个名为 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 是否会导致任何应该避免遇到的未定义行为。

谢谢

4

2 回答 2

5

您当然可以在构造函数中执行此操作,但应该注意 Scott Meyers 在其 Effective/More Effective C++ 书籍中明确解释的问题。

简而言之,他的观点是,如果在构造函数中引发任何类型的异常,那么您的半支持对象将不会被破坏。这会导致内存泄漏。因此,迈耶斯的建议是使用“轻量级”构造函数,然后init在对象完全创建后调用的方法中完成“繁重”工作。

此参数与在构造函数中创建 pthread 池并不严格相关(因此,您可能会争辩说,如果您只是创建它们然后立即挂起它们,则不会引发异常),而是关于在构造函数中做什么的一般考虑(阅读:良好做法)。

另一个需要考虑的是构造函数没有返回值。虽然确实(如果没有抛出异常)即使线程创建失败,您也可以使对象保持一致状态,但管理一种initstart方法的返回值可能会更好。

您还可以阅读有关该主题的 SO 上的这个线程,以及这个.

于 2012-06-29T08:54:02.450 回答
2

从严格形式的角度来看,构造函数实际上只是一个与其他函数一样的函数,应该没有任何问题。实际上,可能存在一个问题:线程实际上可能在构造函数完成之前开始运行。如果线程需要完全构造ServerThread来操作,那么你就有麻烦了——这通常ServerThread是基类的情况,而线程需要与派生类交互。(这是一个很难发现的问题,因为使用最常用的线程调度算法,新线程通常不会立即开始执行。)

于 2012-06-29T10:29:32.877 回答