Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++/Linux:如何编写使用套接字的线程安全库? 我想在Linux下用C++编写一个库,这将有助于应用程序使用某种协议(FastCGI,实际上)。库将侦听套接字(TCP或Unix),接收请求,将它们转发给用户代码,并发送由所述用户代码生成的响应_C++_Linux_Multithreading_Thread Safety_Fork - Fatal编程技术网

C++/Linux:如何编写使用套接字的线程安全库? 我想在Linux下用C++编写一个库,这将有助于应用程序使用某种协议(FastCGI,实际上)。库将侦听套接字(TCP或Unix),接收请求,将它们转发给用户代码,并发送由所述用户代码生成的响应

C++/Linux:如何编写使用套接字的线程安全库? 我想在Linux下用C++编写一个库,这将有助于应用程序使用某种协议(FastCGI,实际上)。库将侦听套接字(TCP或Unix),接收请求,将它们转发给用户代码,并发送由所述用户代码生成的响应,c++,linux,multithreading,thread-safety,fork,C++,Linux,Multithreading,Thread Safety,Fork,套接字上将有许多连接,每个连接将承载许多请求(可能同时-有一个交错机制)。用户代码(使用库)很可能是多线程的,以便并行处理多个请求 我希望我的库是健壮的,并尽可能少地对用户代码进行假设/要求,包括使用的多线程类型。据我所知,Linux中的clone()函数可以以几十种不同的方式派生一个进程——有或没有共享内存、共享文件句柄等。如何实现多线程应由用户决定 这让我很困惑,因为库代码会突然发现自己被fork()”屏蔽,并且代码的多个副本会突然从同一个套接字读取并处理同一个请求。更糟糕的是,父进程可能会

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

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

这让我很困惑,因为库代码会突然发现自己被
fork()
”屏蔽,并且代码的多个副本会突然从同一个套接字读取并处理同一个请求。更糟糕的是,父进程可能会终止,只剩下子进程,而子进程又会产生更多的子进程,甚至可能是在不同的进程名称空间中,这是一个混乱


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

不要直接使用
clone
(将
clone
保留给
pthread
等线程库的实现者)。不要使用太多的
fork
-s(可能没有)。使用
pthread
-s转到

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

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

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

您可能希望使用一些事件循环库,如or(围绕一个-ing循环)

阅读一些好书,尤其是在开始编码之前


另外,学习与您的目标类似的几个自由软件库的源代码

不要直接使用
clone
(将
clone
保留给线程库的实现者,如
pthread
)。不要使用太多的
fork
-s(可能没有)。使用
pthread
-s转到

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

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

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

您可能希望使用一些事件循环库,如or(围绕一个-ing循环)

阅读一些好书,尤其是在开始编码之前


另外,学习与您的目标类似的几个自由软件库的源代码

冒着似乎偏离正轨的风险,我建议在每个处理器单线程的基础上实现fastcgi

原因:

  • 更健壮
  • 避免与多线程相关的上下文切换开销,并防止并发死锁等问题
  • 避免了process fork()的成本(尽管所有这些成本加起来都很低) 并且保护您免于处理潜在的儿童僵尸进程和其他令人头痛的问题
  • 这将使您可以选择使用以下方式实现fastcgi接口:

  • 非阻塞同步I/O(设计模式):阻塞直到收到读或写请求,将请求传递给 然后阻塞,直到下一个请求传入
  • 异步I/O(设计模式):将读写请求传递到O/S支持I/O的操作系统 完成活动。在窗户上,那将是 在Linux上类似于

  • 冒着似乎偏离正轨的风险,我建议在每个处理器单线程的基础上实现fastcgi

    原因:

  • 更健壮
  • 避免与多线程相关的上下文切换开销,并防止并发死锁等问题
  • 避免了process fork()的成本(尽管所有这些成本加起来都很低) 并且保护您免于处理潜在的儿童僵尸进程和其他令人头痛的问题
  • 这将使您可以选择使用以下方式实现fastcgi接口:

  • 非阻塞同步I/O(设计模式):阻塞直到收到读或写请求,将请求传递给 然后阻塞,直到下一个请求传入
  • 异步I/O(设计模式):将读写请求传递到O/S支持I/O的操作系统 完成活动。在窗户上,那将是 在Linux上类似于

  • 我们在谈论线程,
    fork
    clone
    一气呵成。。。这是一个很高的要求。@KerrekSB:正如我所说的-我希望这个选择(threads/fork/clone)与我的库的用户共存,库应该能够处理它的使用方式。。。当然,如果可能的话P我还在某个地方读到,
    fork()
    实际上是带有一组特定标志的
    clone()
    。@KerrekSB:P.S.我对Windows非常熟悉,但我还没有在Linux上写任何东西,这可能会显示出来。我是tr