【问题标题】:C shared memory using fork()使用 fork() 的 C 共享内存
【发布时间】:2012-04-26 15:21:54
【问题描述】:

所以情况是这样,我必须在 unix 中使用 c 开发一个多人游戏。现在我创建了套接字,服务器和客户端通信正常。现在这个游戏包括一个棋盘,所以每个客户端都有自己的 100x40 二维数组,并且他们使用读/写(也可以正常工作)将 x 和 y 位置发送到服务器。

现在,在服务器中,我正在使用 fork() 以便新客户端可以加入游戏。在孩子的部分,我收到 x 和 y 位置。现在我的问题是,如何将 x 和 y 位置存储到服务器中的“全局”板[100][40](因此我可以检查冲突等)。我发现的困难是每个孩子都有自己版本的板,因为我使用的是 fork(),而且我只是更新那个特定孩子的板。我希望每次客户端发送它的 x 和 y 位置时,我都会将它们放在服务器中找到的板上。

我读到我需要使用某种 IPC,比如共享内存,但无法弄清楚。如果有人可以提供帮助,将不胜感激,谢谢。

【问题讨论】:

  • 这个答案可以帮到你:stackoverflow.com/questions/1327349/…
  • 为什么不使用线程而不是进程?
  • 我们的讲师强烈建议使用 fork 代替,因为它更容易并且不需要担心竞争条件等。
  • 你不用担心竞态条件的唯一原因是,如果它们不共享内存,默认情况下分叉不共享内存,这就是它避免竞态条件的原因。只要你想要一个带有 fork 的全局内存,竞争条件就会像线程一样发生
  • 确实如此。在可以使用线程通信的情况下,只需通过 IPC 使用它。你会让你的生活更轻松。

标签: c fork shared-memory


【解决方案1】:

使用共享内存 API 调用:shmgetshmatshmdet、...Example code

如果服务器很简单,您可以使用线程。使用线程,您可以简单地访问相同的全局变量。

【讨论】:

    【解决方案2】:

    您可以使用线程而不是进程,因为它们是轻量级的,即它们的开销要少得多。这个想法是在堆上分配板,以便在此进程中的所有线程之间共享它。

    当有新玩家加入游戏时,create a new thread

    当玩家需要更新自己的看板信息时,共享看板应该以互斥方式访问,防止race condition,如:

    void UpdateBoard(int X, int Y)
    {
      // e.g., pthread_mutex_lock
      Enter critical section
      ..
      Update board(X, Y)
      ..
      // e.g., pthread_mutex_unlock
      Leave critical section
    }
    

    【讨论】:

      【解决方案3】:

      使用数据库可以解决所有锁定/并发问题。

      【讨论】:

        猜你喜欢
        • 2011-02-10
        • 2021-01-19
        • 2010-12-30
        • 1970-01-01
        • 2021-12-04
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        相关资源
        最近更新 更多