c++ - 可以在构造函数中创建 Pthreads 吗?

标签 c++ multithreading constructor pthreads threadpool

我想创建一个线程池。我有一个名为 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
         }
   }

我想知道在构造函数中创建 pthreads 是否会导致任何应该避免遇到的未定义行为。

谢谢

最佳答案

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

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

这个论点与在构造函数中创建 pthreads 池并不严格相关(因此你可能会争辩说如果你简单地创建它们然后立即挂起它们就不会引发异常),但它是关于做什么的一般考虑在构造函数中(阅读:良好实践)。

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

您还可以阅读 this thread on S.O.关于这个话题,和this one .

关于c++ - 可以在构造函数中创建 Pthreads 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11258725/

相关文章:

multithreading - 如何编写多线程perl脚本来写入日志文件?

java - 向我的游戏添加第二个关卡

c++ - 具有 3 个线程的多线程程序,可打印数字序列

c++ - 非静态成员作为 C++ 中的默认参数

java - 创建大型固定线程池的后果

java - 在java中创建对象的最佳实践

scala - 在scala中的构造函数内部调用函数

c++ - 为什么我需要绑定(bind)姿势矩阵的逆来计算动画?

c++ - 调试 Quantlib 源代码

wpf - WPF在不同线程中创建多个窗口