c - 多进程无锁

标签 c parallel-processing locking fork

我正在操作系统类中开发一个项目,我们正在使用 C 语言,但我们还没有学习用于一致性编程的锁。

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

我们有一个父进程,它将根据给定函数的参数来 fork 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 = *<ptr>++

我想是的,但是有没有什么好的方法可以在不使用锁的情况下解决这个问题?

最佳答案

fork 子进程通常会获取其父进程内存的副本。一个子级更新这些指针之一不应对该指针的任何其他子级版本产生影响。

完成类似于您所追求的任务的一种方法是,当父级 fork 子级时,它会在每次 fork 后检查它们的 pid() ,然后像在下一个 fork() 之前一样更新这些指针.

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");
  }
}

关于c - 多进程无锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28648354/

相关文章:

C:数组输出

c - 调试子进程不适用于 set detach-on-fork off

iPhone 媒体播放器框架访问原始文件

c# - 如果作为单独的任务启动,有没有办法取消 Parallel.ForEach 循环

c - 统一并行 C - 示例和扩展列表

java - MySQL InnoDB 在等待表级锁时挂起

android - HTC Desire 中的数据库锁定问题

c - Ascii 转换错误

r - 在 Windows 上使用 Caret 并行进行递归特征消除

java - 互斥锁与彼得森算法?