我有一个程序,其中我有一个父进程,我想创建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,那么一个进程应该接受它,做一些事情,写一些东西出来。然后父进程应该写入另一个值,比如10。在我的程序中,子进程可以读取5两次或更多次。
我是否应该使用互斥信号量来确保子进程读取正确的值,并确保父进程在其中一个子进程读取该值时对其进行更新?
有什么想法吗?
发布于 2014-11-22 06:41:38
所以,你可以通过这种方式在你的共享内存中安排数据:
int Number;
bool Number_IsRead; // Initialized by 'true'.
当你需要传递一个数字时,你应该这样做
Number_IsRead = false;
孩子在读数字前应该检查一下Number_IsRead。当Number已读取时,子级应将true赋值给Number_IsRead。
如果你有3个孩子需要读取数字,你应该创建3个标志(bool Number_IsRead3)。此外,当您更改Number或Number_IsRead时,必须使用信号量。
附注:一般来说,使用共享内存而不是消息队列(msgget/msgctl/msgsnd/msgrcv/等)不是一个好主意。
https://stackoverflow.com/questions/27067535
复制相似问题