2014-11-21 142 views
0

我有一个程序,我有一个父进程,我想创建3个子进程。读写共享内存

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

的理念是:

父进程具有3点的整数,并且在共享存储器(IN)这些整数中的一个来写。然后,其中一个子进程读取它,执行一些计算,并在共享内存(OUT)中写入父母读取结果的位置。然后父进程增加了下一个整数共享内存等..

这是我的代码部分在那里我尝试工具的第一部分(从共享内存写 - 读):

// 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次或更多次。

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

任何想法?

回答

0

所以,你可以用这种方式安排你在共享内存中的数据:

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

当你需要传递一个号码,你应该做的

Number_IsRead = false; 

孩子应该读之前检查Number_IsRead数。 当Number已经读取时,child应该将true赋给Number_IsRead。

如果你有3个孩子需要阅读数字,你应该创建3个标志(bool Number_IsRead [3])。 当您更改Number或Number_IsRead时,您也必须使用信号量。

P.S.一般来说,使用共享内存而不是消息队列(msgget/msgctl/msgsnd/msgrcv/etc)并不是一个好主意。