【发布时间】:2021-02-14 21:55:09
【问题描述】:
我正在编写一个小型库,它在内部使用 OS 套接字 API 进行一些网络连接。
在 Windows 上,需要通过在开头调用 WSAStartup 并在结尾调用 WSACleanup 来初始化 Winsock。但是documentation 表示允许多次初始化 Winsock,然后清理相同次数,因为它在内部使用引用计数。
现在我正在解决一个难题。对于图书馆作者来说,更好的做法是什么?
- 提供调用
WSAStartup/WSACleanup的全局函数initializeLibrary/terminateLibrary,并指示用户在其应用程序的开头/结尾调用它们。 - 在我的类的构造函数/析构函数内部调用
WSAStartup/WSACleanup,根本不用打扰用户。
现在我看到第二个选项看起来更方便,但这是个好主意吗?这样做不会有什么隐藏的不良后果吗?它会对性能产生影响吗?图书馆偷偷做这件事是个好习惯吗?
【问题讨论】:
-
它会影响性能吗? -- 你认为引用计数会阻止什么?另外,像 boost::asio 这样的库是如何处理这个问题的?
-
嗯,是的,但它仍然可能会锁定一些互斥锁,因为它希望是线程安全的。
标签: c++ sockets networking network-programming winsock2