2012-04-14 70 views
1

因此,這裏的情況,我要開發UNIX用c多玩家遊戲。現在我創建了套接字,服務器和客戶端通信正常。現在這個遊戲包括板,所以每個客戶端具有的100x40其自己的2D陣列,以及他們正在使用的讀/寫(其工作確定太)到服務器發送所述x和y位置。ç共享內存使用fork()的

現在,在服務器上,我使用fork()的,這樣新的客戶端可以加入遊戲。在孩子的部分,我收到了x和y的位置。現在的問題是,我怎麼能存儲x和y位置,以「全球」板[100] [40]在服務器中發現(這樣我就可以檢查碰撞等)。我發現的困難是每個孩子都有自己的版本,因爲我使用fork(),而且我只更新那個特定孩子的板子。我希望每次客戶端發送x和y位置時,我都會將它們放置在服務器中找到的主板上。

我讀過,我需要使用某種形式的IPC,如共享內存,但無法弄清楚。如果有人能幫助它將不勝感激,謝謝。

+0

這個回答可以幫助你:http://stackoverflow.com/questions/1327349/how-can-i-share-memory-between-parent-child-process-that-free-the-memory-automat – 2012-04-14 15:35:11

+0

爲什麼不使用線程而不是進程? – 2012-04-14 15:35:31

+0

我們的講師強烈建議使用分叉來代替它,因爲它更容易,不需要擔心競爭條件等。 – 2012-04-14 16:00:28

回答

2

使用共享內存API調用:shmget,shmat,shmdet,... Example code

如果服務器是簡單的,你可以使用線程。使用線程可以簡單地訪問相同的全局變量。

1

您可以使用線程而不是進程,因爲它們是輕量級的,即它們的開銷較小。我們的想法是在堆上分配電路板,以便在此過程中的所有線程之間共享電路板。

當有新的玩家在遊戲中,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 
} 
0

使用數據庫將解決你所有的鎖定/併發問題。