gpt4 book ai didi

c - 多进程无锁

转载 作者:行者123 更新时间:2023-11-30 15:23:48 26 4
gpt4 key购买 nike

我正在操作系统类中开发一个项目,我们正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com