在共享库中创建线程是不好的做法吗?

时间:2014-12-04 21:03:33

标签: c++ multithreading shared-libraries

我正在创建一个共享库,其中一个类在其构造函数中创建一个线程,该线程运行它直到调用析构函数。此类的所有方法都是线程安全的。像这样:

class NetworkRPCConnection {
  std::thread t;
public:
  NetworkRPCConnection() : t([](){maintain_connection();}) {}
  ~NetworkRPCConnection(){close_connection(); t.join();}
}

这很好用,但在共享库中创建线程是不好的做法吗?是否值得在API文档中提及,或者隐藏此实现细节是否更好?

1 个答案:

答案 0 :(得分:7)

一般来说,最好避免在共享库中创建线程,但在某些情况下可以正常 - 但在这些情况下,您确实需要在API中记录它。

您需要记录它的原因是线程可以很难交互以预测某些操作的方式 - 特别是fork()和信号;这使得无法完全隐藏"线程作为实现细节,因为库用户需要知道它。

至于为什么最好不要创建线程:通常,库的用户更好地了解他们的线程模型 - 例如,他们可能已经有了一个可以完成工作的线程,所以创建另一个只会产生额外的开销(并限制它们的实现)。但是如果您非常了解库用户的要求,并且知道需要一个专用线程,并且可以处理线程生命周期的所有方面 - 那么可以创建和自己管理线程 - 但是,如上所述,你肯定需要记录它。