【发布时间】:2011-07-28 15:41:44
【问题描述】:
您对使用 "fork() function" 和 "shared memory" 块模拟 thread 有何想法...
有可能吗?
为一个程序做这件事多少是合理的? (我的意思是,它会很好用吗..?)
【问题讨论】:
标签: c++ c multithreading fork
您对使用 "fork() function" 和 "shared memory" 块模拟 thread 有何想法...
有可能吗?
为一个程序做这件事多少是合理的? (我的意思是,它会很好用吗..?)
【问题讨论】:
标签: c++ c multithreading fork
对于初学者,不要mix a thread and fork()。
fork 为您提供了一个全新的进程,它是当前进程的副本,具有相同的代码段。随着内存映像的变化(通常这是由于两个进程的不同行为),您会分离出内存映像,但可执行代码保持不变。任务不共享内存,除非它们使用一些进程间通信 (IPC) 原语。
相比之下,线程是同一任务的另一个执行线程。一个任务可以有多个线程,并且任务内存对象在线程之间共享,因此必须通过一些原语和同步对象来访问共享数据,以避免数据损坏。
【讨论】:
是的,这是可能的,但我无法想象这是一个好主意,而且测试起来真的很痛苦。
如果您有一个共享堆,并且您确保所有信号量等都分配在堆中,而不是堆栈中,那么您没有内在的理由不能做类似的事情。不过会有一些棘手的差异。
例如,您在多线程程序的中断处理程序中所做的任何事情都可以更改所有线程使用的数据,而在分叉程序中,您必须发送多个中断,这些中断会在不同的时间被捕获,并可能导致意想不到的影响。
如果您想要线程行为,只需使用线程即可。
【讨论】:
AFAIK,fork 将使用自己的上下文、堆栈等创建一个单独的进程。取决于你所说的“模拟”是什么意思......
你可能想看看这个:http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them
【讨论】:
这里的一些答案集中在“不要混合使用叉子和线程”。但我读到你的问题的方式是:“你能否使用两个不同的进程,并且仍然可以通过它们之间的共享内存快速方便地进行通信,就像线程如何访问彼此的内存一样?”
答案是,你可以,但你必须记住明确标记你想要共享的内存区域。您不能只在流程之间共享变量。此外,您可以通过这种方式在完全不相关的进程之间进行通信。它不限于相互分叉的进程。
【讨论】: