父进程预先执行了许多进程,每个preforked进程创建了多个线程(线程池)。同一地址空间中的所有线程可以共享数据,并且可以对关键部分使用不同的同步技术。我想知道如何在来自不同地址空间的线程之间进行同步。我最初的想法(我可能错了)是使用共享内存并使用信号量进行同步。这种设计将增加两个信号量/互斥量的使用。
有没有更好的设计来克服这个问题?我知道apache 2.0使用混合多进程和多线程服务器设计。如果我对混合方法有一些骨架代码的想法会很有帮助。我更关注可扩展性和健壮性。
答案 0 :(得分:2)
我通常坚持使用一个或另一个 - fork,并使用进程间IPC(共享内存,管道,套接字等)或线程,并通过内存结构进行通信。除非混合分叉和线程给你买东西,否则我建议选择一个并运行它。
答案 1 :(得分:2)
通常,如果您需要在不共享地址空间的两个线程之间进行同步,那是因为它们正在同一个文件的同一区域上工作。
flock()
(以及fcntl()
中更精细的变体)可以解决这个问题。
如果是因为他们在同一个数据库表上工作,那么就使用你的DBMS事务。