C ++ / Linux:你如何编写一个使用套接字的线程安全库?

时间:2012-11-11 14:09:50

标签: c++ linux multithreading thread-safety fork

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

套接字上将有许多连接,每个连接将携带许多请求(可能同时 - 存在交错机制)。用户代码(使用库)很可能是多线程的,以便并行处理多个请求。

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

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

哪些Linux工具有助于协调需要访问相同外部资源(套接字)的相同代码的所有副本?实现此类线程安全库的标准方法是什么?我必须自己选择一个线程模型并将其强加给我的图书馆的消费者吗?

2 个答案:

答案 0 :(得分:0)

请勿直接使用clone(保留clone实现者等线程库,例如pthread)。不要使用大量的fork - s(可能没有)。使用pthread - s。

您可以查看libonion库的设计。它很小,实现了HTTP服务器协议,因此与您的目标非常相似。

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

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

您可能希望使用某些事件循环库,例如libeventlibev(围绕poll(2) - 循环)。

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

此外,研究几个类似于您的目标的免费软件库的源代码。

答案 1 :(得分:0)

冒着看似正在切线的风险,我建议在每个处理器的单线程的基础上实现fastcgi。

原因:

  1. 更强大。
  2. 避免与多线程相关的上下文切换开销,并保护您免受并发死锁等问题的影响。
  3. 避免进程fork()成本(虽然很轻,但所有这些都会增加) 并保护您免受处理潜在的儿童僵尸进程等其他麻烦。
  4. 这将使您可以选择使用以下方法实现fastcgi接口:

    1. 非阻塞同步I / O Reactor设计模式):阻塞,直到读取或写入请求进入,将请求传递给 适当的处理程序,然后阻止,直到下一个请求进入。
    2. 异步I / O Proactor设计模式):将读写请求传递给操作系统,其中O / S支持I / O 完成事件。在Windows上IO completion ports 在Linux上类似epoll()