【问题标题】:Model for a multithreaded/forked server daemon多线程/分叉服务器守护进程的模型
【发布时间】:2011-08-19 01:30:43
【问题描述】:

我正在用 C++ 开发一个连接数据库的 Linux 守护程序,它将充当某些联网控制器设备的“服务器”。它必须具有某种形式的并发性才能同时为多个设备提供服务。服务器将监听传入的连接和 fork/thread/select()/whatever 为每个连接的设备。此连接应保持打开状态,直到它断开或关闭。客户端不会是多线程的,因此它们一次可能只有一个连接。

该项目要求设备能够使用将要处理的命令(通常包括数据库查询)与“服务器”联系,然后将命令发送到另一台联网设备。数据库查询将确定要与哪些其他客户端交谈。然后我必须找到它附加到哪个进程或线程,并通过与该线程的现有连接与设备通信。

想一想一个设备上的某种形式的“授权”导致另一个设备接收命令并执行某些操作。我不能只在设备之间发送“点对点”命令,因为所有内容都必须记录在服务器上,并且可能需要数据库查询。

我对线程/进程之间的通信感到困惑。我预计有一个客户端类(即Device)并在每个单独的进程或线程中创建一个对象。我知道使用 fork() 时的命名管道和共享内存,以及与其他线程通信的技术,但我担心同步和潜在的稳定性问题。在我遇到这个问题之前,我对 fork 及其易用性和简单性感到兴奋。稳定性是第一大问题。

我这样做完全错了吗?我的描述不是很好,所以那些认为你可以提供帮助的人可能不得不先提问。也许有人刚刚完成了类似这样的构建......


对于这个问题的冗长和相当模糊的性质,我深表歉意。这更像是一个设计问题,而不是一个直接的、可回答的问题。我不确定它是属于 Programmers 还是属于 SO。如有必要,请随意移动。

感谢所有试图挽救我理智的人。

更新:如果我为此使用 Boost.Asio,谁能给我一个简短的解释/示例代码或指出正确的方向吗?

【问题讨论】:

    标签: c++ linux multithreading daemon


    【解决方案1】:

    您应该看看 Boost::Asio 和活动对象模式。 在 boost'Con 2010 上有一个关于这个主题的精彩视频/讨论,您可以在 blip.tvB 上找到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多