首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读写共享内存

读写共享内存
EN

Stack Overflow用户
提问于 2014-11-22 02:01:58
回答 1查看 986关注 0票数 0

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

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

这个想法是:

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

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

代码语言:javascript
运行
复制
// 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两次或更多次。

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

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2014-11-22 06:41:38

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

代码语言:javascript
运行
复制
int Number;
bool Number_IsRead; // Initialized by 'true'.

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

代码语言:javascript
运行
复制
Number_IsRead = false;

孩子在读数字前应该检查一下Number_IsRead。当Number已读取时,子级应将true赋值给Number_IsRead。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27067535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档