C++ 如何处理以下代码的同步?

C++ 如何处理以下代码的同步?,c++,multithreading,c++11,fork,semaphore,C++,Multithreading,C++11,Fork,Semaphore,我一直在尝试做一些多线程和进程同步。我正在使用fork创建一个父进程和一个子进程 如何实现父子同步以及必须使用哪种类型的同步 我尝试了互斥,但以死锁告终 // class1 threadfunction void Class1::threadFunction() { while(1) { std::cout<<"IN CLASS 1 FUNCTION\n\n"; i++; sleep(2); } } //cla

我一直在尝试做一些多线程和进程同步。我正在使用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();
    }
}
。 . .

< P>同意@ LoelZeZHOW-您应该考虑线程和同步互斥体或信号量。< /P> 注意,如果分叉是唯一的选择,那么您将需要两个进程都可以访问的共享内存。这可以是他们共享的一个文件,或者一个共享内存段。无论哪种情况,都需要构造一个类似互斥体的结构


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

您想创建一个新进程(使用fork)的原因是什么?仅仅对线程执行多线程处理就足够了吗?您需要有2个事件对象。每个线程为另一个线程发送信号事件,并等待self事件。如果你愿意order@LorenzZhao我在my函数中有一个while(1)循环,如果它卡在第一个线程中,我怎么可能创建两个线程?@ShreekarGowrishankar:从createN方法中调用.join()。为了给您一个工作示例,您应该进一步指定您想要实现的目标。(仅仅获得一个顺序输出不需要多线程。)您的目标是并行化一些长时间运行的东西(示例代码中的sleep(2))并同步这些东西的结果(在您的情况下是交替的)?互斥体提供独占访问,但不提供捕获顺序。如果我更新任何值,共享内存是有意义的,但在这里,它们只是打印,所以没有实际的内存共享要求。除了fork之外,我还有什么选择呢?因为线程函数有一个while(1)循环。所以,需要记住的关键是,您提供的任何同步都需要在单独的处理行之间进行通信。即使在UDP网络处理方面,只要信息没有实际离开机器,它也只是作为虚拟文件(即共享内存)处理。线程与分叉实际上与无限循环设计无关;相反,你在这个循环中所做的事情需要改变。考虑某种类型的标志,每一行的处理必须评估,要么在一个状态下运行,另一个处于睡眠状态。
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