请教关于“多个进程往同一个匿名管道写数据”时的进程间数据同步问题
父进程A:
int main()
{
// 步骤1:创建一个匿名管道
// 步骤2:创建5子进程B,并重定向子进程的标准输出
// 步骤3:调用WaitForMultiObjects()等待5个子进程执行结束,通过GetTickCount()计算子进程执行花费的时间
// 步骤4:读取匿名管道中的内容到一个缓冲区中 char buffer[1024 * 4]
return 0;
}
子进程B:
int main()
{
DWORD dwCurProcessID = GetCurrentProcessId();
printf("%d: 00001111\n", dwCurProcessID);
Sleep(1000);
printf("%d: 00001111\n", dwCurProcessID);
Sleep(1000);
printf("%d: 00001111\n", dwCurProcessID);
Sleep(1000);
return 0;
}
// 疑问:
1. 等待5个子进程B执行完毕花费的时间不超过5s,而每个子进程B需要Sleep 3s,说明写匿名管道是异步的?
2. 父进程从匿名管道中读取到得数据是以下形式:
4896: 00001111
4896: 00001111
4896: 00001111
5012: 00001111
5012: 00001111
5012: 00001111
... ...
也就是说,数据是一个进程写完,才能够下一个进程往管道写数据,这是典型的同步模式?
那么,多个进程往一个匿名管道写数据,到底是同步还是异步?
我跟踪看了printf的实现代码,用的是旋转锁,该锁是用户对象,只能用于同一个进程内部的线程间同步,而上述场景是进程之间的线程同步,实验结果表明往管道写数据是经过同步的,那么说明匿名管道本身具有线程安全属性?