gpt4 book ai didi

c - 读写共享内存

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

我有一个程序,其中有一个父进程,并且我想创建 3 个子进程。

我还创建了 2 个共享内存(IN、OUT),并为每个共享内存创建了 1 个信号量。

想法是:

父进程有 3 个整数,并且必须在共享内存 (IN) 中写入这些整数之一。然后,其中一个子进程读取它,进行一些计算,并在共享内存 (OUT) 中写入一些内容,父进程从其中读取结果。然后父进程将下一个整数添加到共享内存中,依此类推。

这是我的代码的一部分,我尝试实现第一部分(从共享内存IN写入-读取):

// create and attach shared memory

memidIN = shmget(...);
memidOUT= shmget(...);
pointerIN = (...) shmat(...);
pointerOUT = (...) shmat(...);

// create and init semaphores

semIN = semget(...);
semOUT = semget(...);
semctl(semIN, ...); // initialize both to 1
semctl(semOUT, ...);

for (i = 0; i < children; ++i)
{
pid = fork();

if (pid)
{
// parent process code

down sem_IN
write in shmIN
up sem_IN

}
else if (pid == 0)
{
// Children processes code

down sem_IN
read from shmIN
up sem_IN

exit(0);

}
else
//ERROR


}

// dont die until childrens die
for( j = 0; j < children; j++)
wait(&status);

问题是,我如何确保子进程读取正确的值?我的意思是,如果父进程写入 5,那么一个进程应该接受它,做一些事情,在 OUT 中写一些东西。然后父级应该写入另一个值,比如说 10。在我的程序中,子进程可以读取 5 2 次或更多次。

我应该使用互斥信号量来确保子进程读取正确的值并确保父进程在其中一个子进程读取该值时更新该值吗?

有什么想法吗?

最佳答案

因此,您可以通过以下方式在共享内存中排列数据:

int Number;
bool Number_IsRead; // Initialized by 'true'.

当你需要传递一个数字时,你应该这样做

Number_IsRead = false;

child 在读取 Number 之前应该检查 Number_IsRead。当 Number 已读取时,child 应将 Number_IsRead 赋值为 true。

如果您有 3 个 child 需要读取 Number,您应该创建 3 个标志 (bool Number_IsRead[3])。另外,当您更改 Number 或 Number_IsRead 时,您必须使用信号量。

附注一般来说,使用共享内存代替消息队列(msgget/msgctl/msgsnd/msgrcv/等)并不是一个好主意。

关于c - 读写共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27067535/

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