我一直在尝试做一些多线程和进程同步。我正在使用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
。 。 。
答案 0 :(得分:0)
与@LorenzZhao达成协议-您应考虑使用线程并与互斥量或信号量同步。
请注意,如果唯一选择是分叉,则将需要两个进程都可以访问的共享内存。这可能就像它们都共享的文件或共享的内存段一样简单。无论哪种情况,都需要构造类似互斥体的结构。
编辑:按照@RbMm的说明,如果您尝试获得序列化的同步,则互斥锁和信号灯可能是错误的方法。您可以考虑使用标志变量,以便线程仅在标志处于给定状态时运行,否则进入休眠状态。这也意味着当线程完成其操作时,需要将标志变量转换为其后续状态。这也可以在单独的进程之间的共享内存中完成。