【问题标题】:Simulating Thread with fork()用 fork() 模拟线程
【发布时间】:2011-07-28 15:41:44
【问题描述】:

您对使用 "fork() function""shared memory" 块模拟 thread 有何想法...

有可能吗?

为一个程序做这件事多少是合理的? (我的意思是,它会很好用吗..?)

【问题讨论】:

    标签: c++ c multithreading fork


    【解决方案1】:

    对于初学者,不要mix a thread and fork()

    fork 为您提供了一个全新的进程,它是当前进程的副本,具有相同的代码段。随着内存映像的变化(通常这是由于两个进程的不同行为),您会分离出内存映像,但可执行代码保持不变。任务不共享内存,除非它们使用一些进程间通信 (IPC) 原语。

    相比之下,线程是同一任务的另一个执行线程。一个任务可以有多个线程,并且任务内存对象在线程之间共享,因此必须通过一些原语和同步对象来访问共享数据,以避免数据损坏。

    【讨论】:

    • 我以前读过!我的意思是制作一个 myThread() 来模拟一个与真实线程产生相似结果的进程。
    • @EmAdpres:对不起,请您澄清一下。另外,我的朋友不必激动。
    • @EmAdpres:有些事情你将无法用不同的进程来做,比如访问同一个全局变量......但同样,这取决于你所说的“模拟”或“类似”的意思结果”
    • @EmAdpres:您始终可以使用管道或文件 I/O 在进程之间传递数据。但是,使用 fork() 模拟线程就像苹果和橘子一样。他们不混合。这就是为什么我解释了这两个概念,以便您理解。也许如果您更清楚地解释您到底想要什么,我们可以更好地回答。
    • @EmAdpres:如果这是您想要的,您可以使用共享内存吗? stackoverflow.com/questions/1963642/shared-memory-for-fork
    【解决方案2】:

    是的,这是可能的,但我无法想象这是一个好主意,而且测试起来真的很痛苦。

    如果您有一个共享堆,并且您确保所有信号量等都分配在堆中,而不是堆栈中,那么您没有内在的理由不能做类似的事情。不过会有一些棘手的差异。

    例如,您在多线程程序的中断处理程序中所做的任何事情都可以更改所有线程使用的数据,而在分叉程序中,您必须发送多个中断,这些中断会在不同的时间被捕获,并可能导致意想不到的影响。

    如果您想要线程行为,只需使用线程即可。

    【讨论】:

      【解决方案3】:

      AFAIK,fork 将使用自己的上下文、堆栈等创建一个单独的进程。取决于你所说的“模拟”是什么意思......

      你可能想看看这个:http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them

      【讨论】:

      • 我认识他们。也许,我们可以将子进程的结果存储在某个地方并在其他进程中使用它......我的意思是手工线程:D
      【解决方案4】:

      这里的一些答案集中在“不要混合使用叉子和线程”。但我读到你的问题的方式是:“你能否使用两个不同的进程,并且仍然可以通过它们之间的共享内存快速方便地进行通信,就像线程如何访问彼此的内存一样?”

      答案是,你可以,但你必须记住明确标记你想要共享的内存区域。您不能只在流程之间共享变量。此外,您可以通过这种方式在完全不相关的进程之间进行通信。它不限于相互分叉的进程。

      看看shared memory or "shm"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-12
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 2016-02-21
        • 2020-05-19
        相关资源
        最近更新 更多