首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++/Linux:如何编写使用套接字的线程安全库?

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

Stack Overflow用户
提问于 2012-11-11 14:09:49
回答 1查看 914关注 0票数 2

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

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

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2012-11-11 15:01:50

我建议在每个处理器的单线程上实现,这样做的风险似乎是正切的。

原因:

  1. 更强壮。
  2. 避免与多线程相关的上下文切换开销,并保护您免受并发死锁等问题的影响。
  3. 避免Process叉()成本(虽然很轻,但所有这些都会增加),并防止您处理潜在的子僵尸进程以及其他令人头疼的问题。

这将使您可以选择使用以下方法实现快速you接口:

  1. 非阻塞同步I/O (反应堆设计模式):阻塞直到读取或写入请求进来,将请求传递给适当的处理程序,然后阻塞直到下一个请求传入。
  2. 异步I/O (前置器设计模式):将读写请求传递到O/S支持I/O完成事件的操作系统。在Windows上,这将是IO完成端口,而在Linux上,类似于epoll()。
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13331858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档