C++/Linux : how do you write a thread-safe library that uses sockets?

标签 c++ linux multithreading thread-safety fork

我想在 Linux 下用 C++ 编写一个库,以帮助应用程序使用某种协议(protocol)(实际上是 FastCGI)。该库将监听一个套接字(TCP 或 Unix),接收请求,将它们转发给用户代码,并发送由所述用户代码生成的响应。

套接字上会有很多连接,每个连接会承载很多请求(可能是同时的——有一种交错机制)。用户代码(使用该库)很可能是多线程的,以便并行处理多个请求。

我希望我的库是健壮的,并尽可能少地对用户代码做出假设/要求,包括所使用的多线程类型。据我所知,Linux 中的 clone() 函数可以用几十种不同的方式派生一个进程——有或没有共享内存、共享文件句柄等。如何实现多线程的决定应该留给给用户。

这让我感到困惑,因为库代码可能突然发现自己被fork() 了,并且代码的多个拷贝可能突然从同一个套接字读取并处理同一个请求。更糟糕的是 - 父进程可能会终止,只留下子进程,这反过来会产生更多的子进程,甚至可能在不同的进程命名空间中 - 这是一团糟。

有哪些 Linux 工具可以帮助协调需要访问相同外部资源(套接字)的相同代码的所有拷贝?实现此类线程安全库的标准方法是什么?我必须自己选择线程模型并将其强加给我的库的使用者吗?

最佳答案

不要直接使用clone(将clone保留给线程库的implementors,比如pthread)。不要使用很多 fork-s(可能没有)。使用 pthread-s。

你可以看看 libonion 的设计图书馆。它很小,实现了 HTTP 服务器协议(protocol),因此与您的目标非常相似。

libonion 为用户提供了多种模式来为请求创建或不创建线程。

您可以选择类似于 libonion-s 的选项来为每个 FastCGI 请求创建或不创建新线程。

您可能想使用一些事件循环库,例如 libeventlibev (围绕一个 poll(2) -ing 循环)。

并阅读好书,特别是 Advanced Linux Programming , 还有一些 tutorial on Pthread-s在开始编码之前。

此外,研究几个与您的目标相似的自由软件库的源代码。

关于C++/Linux : how do you write a thread-safe library that uses sockets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331858/

相关文章:

c++ - 你如何检测你打开的文件在打开后被移动了

linux - Arch Linux gdb 立即崩溃

c# - 查找需要 InvokeRequired 的方法

C# - Thread.Join(Milliseconds) 和 finally block

c++ - 通过 shared_ptr : ThreadSanitzier false positive? 同步

c++ - C++ 中的异步文件 I/O

c# - 获取窗口的描述符

c++ - 在非常大的数字序列中查找句点

c++ - std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ) 使用#include <Windows.h> 时出错

linux - 在 Linux 中修改 PATH