首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-04-07 
请教关于“多个进程往同一个匿名管道写数据”时的进程间数据同步问题父进程A:int mian(){// 步骤1:创建一个

请教关于“多个进程往同一个匿名管道写数据”时的进程间数据同步问题
父进程A:
int mian()
{
  // 步骤1:创建一个匿名管道

  // 步骤2:创建5子进程B,并重定向子进程的标准输出

  // 步骤3:调用WaitForMultiObjects()等待5个子进程执行结束,通过GetTickCount()计算子进程执行花费的时间

  // 步骤4:读取匿名管道中的内容到一个缓冲区中 char buffer[1024 * 4]

  return 0;
}

子进程B:
int mian()
{
  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的实现代码,用的是旋转锁,该锁是用户对象,只能用于同一个进程内部的线程间同步,而上述场景是进程之间的线程同步,实验结果表明往管道写数据是经过同步的,那么说明匿名管道本身具有线程安全属性?

[解决办法]
友情帮顶
[解决办法]
写管道小于PIPE_BUF大小属于原子写入,内容不会交叉,我说的是linux下,WINDOWS不知道。

大于PIPE_BUF要做同步,不管是用mutex还是2值信号量,文件锁之类等,都是一样的道理,可能用到恭共享内存与进程共享mutex,做进一步了解即可。

热点排行