请教关于“多个进程往同一个匿名管道写数据”时的进程间数据同步问题

csuchao csuchao 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
父进程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的实现代码,用的是旋转锁,该锁是用户对象,只能用于同一个进程内部的线程间同步,而上述场景是进程之间的线程同步,实验结果表明往管道写数据是经过同步的,那么说明匿名管道本身具有线程安全属性?
...全文

相关推荐

评论 5
收藏 已收藏
分享
返回顶部
csuchao
进程/线程/DLL 15,466 成员 49,169 内容