多个进程没有锁定

时间:2015-02-21 16:51:01

标签: c parallel-processing locking fork

我在我的OS课程中正在开发一个项目,我们正在使用C语言,而且我们还没有学习有关一致编程的锁定。

我有一个数组,每个进程共享一个指向每个进程共享的数组的指针。

根据给予函数的参数,我们有一个父进程将分支1-10个子进程。该项目的想法是将.png,.bmp和.gif图像转换为.jpg,进程根据其pid转换的图像类型。

if pid mod 3 = 0 convert .png
if pid mod 3 = 1 convert .bmp
if pid mod 3 = 2 convert .gif

我们构建了一个包含所有需要转换的文件的数组,所有进程共享此数组 我们正在考虑有3个int指针bmpptr,pngptr,gifptr。

我们在子进程中有这些行

if getpid() mod 3 = 0
  temp = *pngptr++
else if getpid() mod 3 = 1
  temp = *bmpptr++
else 
  temp = *gifptr++ 

我的问题是操作系统可以控制远离这一行代码中的一个子进程的进程,以便两个子进程具有相同的temp var,因为它在temp被分配后进行控制,但在增量发生了吗?

temp = *<ptr>++

我在想是的,但如果不使用锁,有没有什么好方法呢?

1 个答案:

答案 0 :(得分:1)

分叉儿童流程通常会获得父母内存的副本。更新其中一个指针的一个孩子应该对该指针的任何其他子版本没有影响。

实现类似于你所追求的东西的一种方法是,当父母分叉子女时,它会在每个分叉后检查他们的pid(),然后像下一个那样更新这些指针。叉()。

void forkChildren(unsigned num)
{
  while (num--)
  {
    pid_t ret = fork();

    if (0 == ret) 
    {
      /* child process */

      char *tmp;

      switch (getpid() % 3)
      {
      case 0: tmp = *pngptr; break;
      case 1: tmp = *bmpptr; break;
      case 2: tmp = *gifptr; break;     
      }

      doChild(tmp);
      exit(0);
    } 
    else if (-1 != ret) 
    {
      /* parent process */

      switch (ret % 3)
      {
      case 0: pngptr++; break;
      case 1: bmpptr++; break;
      case 2: gifptr++; break;     
      }
    }
    else
      perror("fork failed");
  }
}