1

これが状況です。UNIXでcを使用してマルチプレイヤーゲームを開発する必要があります。これでソケットが作成され、サーバーとクライアントは正常に通信しています。現在、このゲームにはボードが含まれているため、各クライアントには 100x40 の独自の 2D 配列があり、読み取り/書き込み (これも正常に動作しています) を使用して x と y の位置をサーバーに送信しています。

サーバーでは、新しいクライアントがゲームに参加できるように fork() を使用しています。子供のセクションでは、x と y の位置を受け取っています。ここで私の質問は、x と y の位置をサーバーにある「グローバル」ボード [100][40] に保存するにはどうすればよいかということです (したがって、衝突などをチェックできます)。私が見つけた難しさは、fork() を使用しているため、各子が独自のバージョンのボードを持っていることであり、その特定の子のボードのみを更新しています。クライアントが x と y の位置を送信するたびに、それらをサーバーにあるボードに配置したいと思います。

共有メモリのようなある種の IPC を使用する必要があると読んだことがありますが、それがわかりません。誰かがそれを助けることができれば大歓迎です、ありがとう。

4

3 に答える 3

2

共有メモリAPI呼び出しを使用します:、、、shmget...サンプルコードshmatshmdet

サーバーが単純な場合は、スレッドを使用できます。スレッドを使用すると、同じグローバル変数に簡単にアクセスできます。

于 2012-04-14T15:32:06.303 に答える
1

プロセスの代わりにスレッドを使用できます。スレッドは軽量であるためです。つまり、オーバーヘッドがはるかに少ないためです。アイデアは、ボードをヒープに割り当てて、このプロセスのすべてのスレッド間で共有されるようにすることです。

ゲームに参加する新しいプレイヤーがいる場合は、新しいスレッドを作成します

プレイヤーがボード情報を更新する必要がある場合、次のような競合状態を防ぐために、共有ボードに相互排他的な方法でアクセスする必要があります。

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
}
于 2012-04-14T15:39:07.853 に答える
0

データベースを使用すると、ロック/同時実行の問題がすべて解決されます。

于 2012-04-14T15:45:46.860 に答える