【发布时间】:2018-08-18 11:07:16
【问题描述】:
为了在 Windows 和 Linux/Unix 之间兼容代码。我想使用 MingW 的工具集和 CodeBlocks 进行开发,这样代码就可以在 Linux 和 Windows 上编译和运行。我尝试设计的系统是一个非常繁忙、繁重的数据交换系统,如服务器和客户端,都运行在同一个盒子中,时间很关键。所以我需要服务器和客户端之间的IPC。我想使用用户信号来通知许多客户在某些特定时间进行一些数据处理操作。这意味着我需要一组信号来执行不同的操作。当我将这些信号发送给客户端时,我还需要发送一两个参数。那些 IPC 方法,如事件处理、消息传递、插槽、命名管道、套接字可能不适用于我的目的,因为它们需要客户端不断地抽取/窥视传入的信息,这将花费 CPU 来处理繁忙的系统。)因此,idea 方法将是信号,客户端正在睡觉,只有在收到信号后才会醒来做工作。 对于 Linux 方面,看起来我可以有足够的用户信号来使用 (sigaction for specific) 。但对于 Windows 端,信号仅限于 SIGABRT、SIGFPE、SIGILL、SIGINT、SIGSEGV、SIGTERM。没有用户信号,也不能传递参数。另外,我需要服务器能够通过他们的 pid 向所有客户端广播信号。我查看了 boost 和其他的,到目前为止找不到我可以用于 Windows 的。 有什么建议吗?
【问题讨论】:
-
为这个目标采用任何 actor-model 怎么样,在已经成熟的生态系统的基础上,上述所有要求都是按设计授予的,而不是试图在设计方面就如何绕过/规避所有与 O/S 相关的约束进行字面上的妥协,最终(希望)达到或多或少类似于原生基于参与者的生态系统的东西从第 0 天开始就已经启动并运行,准备好在用户定义的应用程序中高效重用?
-
使用套接字。它们非常适合这些用例,与信号相比处理比较正常,并且具有与信号相同的唤醒行为 - 在
read()上阻塞的应用程序只有在有可用数据时才会被唤醒。 -
这里的套接字太慢了。假设它是通过 tcp/ip,甚至在本地使用。
-
我决定使用 boost 的消息队列来完成这项工作,因为信号捕获很难处理状态和传递数据。
标签: linux windows concurrency signals ipc