【发布时间】:2011-02-20 09:44:18
【问题描述】:
新手问题:
在 Unix 上,在一个有父级和一些子级的程序中:
- 家长如何有效地提醒孩子做一些工作..?
- 或者孩子们如何等待父母的信号开始做一些工作?
编辑:
该程序尝试并行执行复杂的计算,我已经使用共享内存作为所有子级的公共工作区来更新结果和数据传输。
我现在需要的是父母有效地对所有孩子说“开始”......(多次调用)
谢谢
【问题讨论】:
新手问题:
在 Unix 上,在一个有父级和一些子级的程序中:
- 家长如何有效地提醒孩子做一些工作..?
- 或者孩子们如何等待父母的信号开始做一些工作?
编辑:
该程序尝试并行执行复杂的计算,我已经使用共享内存作为所有子级的公共工作区来更新结果和数据传输。
我现在需要的是父母有效地对所有孩子说“开始”......(多次调用)
谢谢
【问题讨论】:
您的ipc 标签说明了一切。您需要研究进程间通信:
毫无疑问还有其他可能性,但这是一个好的开始。
效率在很大程度上取决于您的用例。如果您只需要通知孩子做某事,那么我可能会使用信号。如果您需要在进程之间传输更多信息,最好完全指定要求。
您可能要考虑的一件事是完全绕过所有进程间的东西而只使用线程。至少在 Linux 中,线程是调度程序的一等公民。较旧的 UNIX 可能有所区别(使用用户模式线程),但 Linux 并非如此。
我发现这样做更简单,并且您的信息会自动共享(请记住,您仍然需要使用互斥锁等保护共享内容)。
如果您已经致力于共享内存,另一种可能性是使用信号。假设您已经为每个孩子留出了部分记忆(并且他们知道自己在哪里),信号可能是通知一群孩子进行并行工作的最快方式。
如果您的孩子只是在 select 循环中等待(例如)30 秒超时以执行周期性工作,则信号将导致它立即以 EINTR 退出。这可以让您高效地使用 CPU,同时仍能立即做出响应。
【讨论】:
pause() 的用途。
查看Beej 的 IPC 指南以了解它是如何工作的……它是一个很好的指南。 Beej 还在同一个网站上介绍了套接字。
【讨论】: