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

标签 c++ multithreading shared-libraries

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

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

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

最佳答案

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

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

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

关于c++ - 在共享库中创建线程是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304028/

相关文章:

加载共享库时出现 Linux 错误 : cannot open shared object file: No such file or directory

c++ - 使用 const 后缀自动解析成员函数

c++ - cv::FileStorage 在 Qt 中不起作用

ios - 如何修复 Xcode 中的线程错误?

java - 尽管对象被锁定,但非同步方法仍然可以访问,为什么?

C++ 隐藏符号链接(symbolic link)

c# - 管理源代码的方法

c++ - 忽略空白字符

c++ - WriteFile函数 "freezes"

java - Java 中的线程