c/c++;加入流程?

c/c++;加入流程?,c,process,C,Process,我不熟悉线程和进程 我有一些代码可以很好地将代码分成多个进程。然而,每个进程都需要添加到一个全局变量,但从我所读到的,每次进程分叉时,它都会获取一个全局变量的副本,并独立地添加它们。有没有一种方法可以像线程一样连接它们?不同的进程可以通过共享内存进行通信和交换数据。 在linux上,您可以查看: 文轩大学概览 用于在多个进程上附加内存段 及 man sem_概述 用于控制并行访问的信号量库 您应该定义一个包含两个字段的结构,一个用于全局字段,一个用于信号量。然后,在任何分叉发生之前,在父进程中创

我不熟悉线程和进程


我有一些代码可以很好地将代码分成多个进程。然而,每个进程都需要添加到一个全局变量,但从我所读到的,每次进程分叉时,它都会获取一个全局变量的副本,并独立地添加它们。有没有一种方法可以像线程一样连接它们?

不同的进程可以通过共享内存进行通信和交换数据。 在linux上,您可以查看:

文轩大学概览

用于在多个进程上附加内存段

man sem_概述 用于控制并行访问的信号量库


您应该定义一个包含两个字段的结构,一个用于全局字段,一个用于信号量。然后,在任何分叉发生之前,在父进程中创建一些足够大的共享内存来容纳这个结构并在那里初始化一个。在子对象中,映射到共享内存中,以便他们可以访问全局。所有进程,包括父进程和子进程,在访问全局进程时都应该遵守信号量的规则

为了避免不必要的阻塞(这会影响性能),请尽量不要将信号量保持太长时间。在读取全局信号时,在进程中快速复制并使用它,而不是在使用其值的整个时间内保持信号量。同样,在更改全局变量时,提前准备更改(在获取信号量之前),并且,一旦获得了信号量,立即将其全部复制。有时,你的工作依赖于阅读和书写全球信息,而不会在阅读和书写之间发生变化。在这种情况下,一些阻塞可能是不可避免的


目前还不清楚您在哪个平台上,但所有主要的PC和服务器平台(Windows、Linux/Unix/Mac OS)都支持共享内存和信号量。API可能不同,但您需要的功能是存在的。

您必须深入研究进程间通信。您确实应该使用线程来实现这一点。而且
fork
应该被认为是不推荐使用的,特别是因为在多线程程序中只能在
fork
之后执行异步信号安全函数,并且没有可测试的方法来确定程序不是多线程的(即使是实现的内部部分也可能是多线程的,而您并不知道)@R:正是因为您提出的问题,符合POSIX的实现必须至少表现为实现的内部部分不是多线程的。@caf:这很好,但我找不到任何地方有这样的要求……fork远没有被弃用。当需要真正的独立内存等时,这是一个好方法让操作系统处理封装的方法。分叉还有一个好处,即如果程序的一个部分崩溃,其他部分可以继续运行。但没错,如果您需要共享资源,线程可能是更好的选择。