2014-12-04 66 views
3

我创建一个共享库,以及创建构造函数中的线程它运行它,直到调用析构函数的类。这个类的所有方法都是线程安全的。事情是这样的:在共享库中创建线程是不好的做法吗?

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

这工作得很好,但它是不好的做法,在共享库中创建一个线程?在API文档中值得一提的是,还是隐藏这个实现细节更好?

+3

绝对在API中记录它。 – randomusername 2014-12-04 21:05:05

+0

那么,我读的所有书籍都说,实现细节应该隐藏在文档之外。为什么开发人员想知道,如果库使用线程? – 2014-12-04 21:08:02

+1

开发人员需要知道,因为他们可能会使用线程,如果别的东西正在使用它们,那么这对资源来说就更加紧张。另外,线程通常需要特殊的构建配置和选项才能融入到构建系统中。 – randomusername 2014-12-04 21:13:34

回答

7

一般来说,最好避免在共享库中创建线程,但有些情况下,这是确定 - 但在这种情况下,你真的需要你的API中记录下来。

需要记录它的原因是,线程可以在硬交互预测与某些操作方式 - 尤其是fork()和信号;这使得将线程完全“隐藏”为实现细节是不可能的,因为库用户需要知道它。至于为什么最好不要创建线程:通常库的用户对线程模型有更好的理解 - 例如,他们可能已经有了一个可以完成工作的线程,所以创建另一个线程只会产生额外的开销(并限制其实施)。但是,如果您非常了解库的用户需求,并且知道需要专用线程,并且可以处理线程生命周期的所有方面 - 那么可以自行创建和管理线程 - 但是,如上所述,你肯定需要记录它。