【问题标题】:How do i do process syncronisation for the following code?如何为以下代码进行进程同步?
【发布时间】:2019-11-28 11:21:05
【问题描述】:

我一直在尝试做一些多线程和进程同步。我正在使用 fork 创建一个父进程和一个子进程。

如何实现父子同步以及我必须使用什么类型的同步?

我尝试了互斥锁,但以死锁结束。

// class1 threadfunction
void Class1::threadFunction()
{
    while(1)
    {
        std::cout<<"IN CLASS 1 FUNCTION\n\n";
        i++;
        sleep(2);
    }
}

//class 2 threadfunction
void Class2::threadFunction()
{
    while(1)
    {
        std::cout<<"IN CLASS 2 FUNCTION\n\n";
        j++;
        sleep(2);
    }
}

void Class1::create1()
{
    std::thread newThread (threadFunction);
    newThread.join();
}

void Class2::create2()
{
    std::thread newThread (threadFunction);
    newThread.join();
}

//main function

int main()
{
    std::cout<<"In Main\n\n";
    if(fork())
    {
        Class1 class1Object;
        class1Object.create1();
    }

    else
    {
        Class2 class2Object;
        class2Object.create2();
    }
}

我希望输出是连续的 例如:

IN CLASS 1 FUNCTION
IN CLASS 2 FUNCTION
IN CLASS 1 FUNCTION
IN CLASS 2 FUNCTION
IN CLASS 1 FUNCTION
IN CLASS 2 FUNCTION
IN CLASS 1 FUNCTION
IN CLASS 2 FUNCTION

。 . . .

【问题讨论】:

  • 您是否有理由要创建一个新进程(使用 fork)?仅使用 threads 进行 multithreading 还不够吗?
  • 你需要有 2 个事件对象。每个线程都向另一个发出信号事件并等待自身事件。如果你想订购
  • @LorenzZhao 我的函数中有一个 while(1) 循环,如果它卡在第一个线程中,我怎么可能创建 2 个线程?
  • @ShreekarGowrishankar:从你的 createN 方法中取出 .join() 调用。为了给您一个工作示例,您应该进一步指定您想要实现的目标。 (仅获得顺序输出不需要多线程。)您的目标是并行化一些长时间运行的东西(示例代码中的 sleep(2) )并获得同步的结果(在您的情况下是交替的)?

标签: c++ multithreading c++11 fork semaphore


【解决方案1】:

同意@LorenzZhao——您应该考虑线程化并与互斥锁或信号量同步。

请注意,如果分叉是唯一的选择,您将需要两个进程都可以访问的共享内存。这可以像他们共享的文件或共享内存段一样简单。无论哪种情况,您都需要构建一个类似互斥体的结构。

编辑:根据@RbMm 的说明,如果您试图获得序列化同步,互斥锁和信号量可能是错误的方法。您可以考虑一个标志变量,以便线程仅在标志处于给定状态时运行,否则休眠;这也意味着当线程完成其操作时,它需要将标志变量转换为其后续状态。这也可以在不同进程之间的共享内存中完成。

【讨论】:

  • mutex 提供独占访问权限,但不提供捕获顺序。
  • 如果我要更新任何值,共享内存是有意义的,但在这里它们只是打印,因此没有实际的内存共享要求。除了 fork 之外我还有什么选择,因为线程函数有一个 while(1) 循环
  • 因此,要记住的关键是您提供的任何同步都需要在单独的处理线之间进行通信。即使在 UDP 网络处理方面,只要信息没有物理离开机器,它就只是作为虚拟文件(即共享内存)处理。 Threading vs Forking 真的与无限循环设计没有任何关系;而是您在该循环中所做的事情需要改变。考虑某种标志,每条处理线都必须评估它,或者在一种状态下采取行动,在另一种状态下休眠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2018-12-31
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多