【问题标题】:Creating accessing shared memory in C在 C 中创建访问共享内存
【发布时间】:2009-11-03 00:14:49
【问题描述】:

所以我有一个问题,我真的不知道该怎么解决。我希望也许你能告诉我如何处理它。

我需要在共享内存中分配 N 个缓冲区。每个缓冲区应初始化为 0。然后我必须分叉 N/2 个子进程。

然后每个孩子(i)将值(i)写入缓冲区(i),休眠一秒钟。然后读取当前缓冲区的值,如果值同时更改,则显示一条消息。然后孩子移动 i 位置 N/2 次。

So I can have 
N Buffers = 11. (must be prime)
N/2 children = 5.

So child 2 would:
write into buffer 2, sleep, read from buffer 2. (now move 2 positions)
write into buffer 4, sleep, read from buffer 4. (now move 2 positions)
**remmeber we only have five buffers so we go around again*****
write into buffer 1, sleep, read from buffer 1. (now move 2 positions)
write into buffer 3, sleep, read from buffer 3. (now move 2 positions)
write into buffer 5, sleep, read from buffer 5. ***we stop moving here. N/2 moves already performed.

有什么想法应该怎么做?

  • 我可以只创建一个包含 N 个整数的数组吗?由于所有孩子都将访问相同的元素,这会是个问题吗?

【问题讨论】:

    标签: c shared-memory buffer


    【解决方案1】:

    用于共享内存处理的经典 System V IPC 函数是:

    POSIX 等价物是:

    您使用mmap() 将打开的共享内存对象加载到进程地址空间中。

    【讨论】:

    • 你是我应该使用这些系统调用。这是一个很棒的教程:cs.cf.ac.uk/Dave/C/node27.html
    • mmap() 仅 POSIX 需要,shmat() [at] 在 System V IPC 调用中附加 shm。 (如果不正确请回复!)
    【解决方案2】:

    我可以创建一个包含 N 个整数的数组吗?由于所有孩子都将访问相同的元素,这会是一个问题吗?

    是的,我想是的。如果您使用多个线程,请像这样声明它:

    volatile int sharedChannel[N];
    

    如果您正在使用单独的进程,并且正在使用一个函数来为您提供一个共享内存缓冲区,那么您将需要类似的东西

    volatile int *sharedChannel;
    

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 2015-05-22
      • 2014-04-21
      • 2021-11-26
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多