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

时间:2019-07-19 12:49:39

标签: 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);
    }
}

//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

。 。 。

1 个答案:

答案 0 :(得分:0)

与@LorenzZhao达成协议-您应考虑使用线程并与互斥量或信号量同步。

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

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