2016-03-26 20 views
0

我現在試圖創建基於Linux系統的遊戲,其中有三個過程:創建一個「遊戲」與基於Linux的系統採用C 2名球員和裁判(進程)

  1. 裁判 - 主要工藝
  2. 藍播放器 - 第一個孩子的過程
  3. 紅球員 - 當然,兩個子進程正在使用的fork()功能創建的第二子進程

現在一切都創建好了,我使用共享內存來存儲電路板以及三個進程通用的一些變量。

我的問題是,當我想要考慮如何實現基於回合的遊戲時 - 我創建了一個通用的布爾變量,指出遊戲是否仍在運行或完成,以及決定輪到誰的是它。

現在我們進入共享部分,我暫停了兩個子進程並向第一個子進程發送了一個信號以「喚醒他」,但從現在開始,我如何將所有三個進程保持在一起並同步(裁判醒來的第一個進程,它完成了轉彎和暫停,比裁判醒來的第二個,等等......)

我想我必須保持那部分在某種while(game_finished == FALSE)循環,但從那裏我'米卡住了。

我如何以我剛纔解釋的方式實現那個遊戲?謝謝。

+1

你需要叉嗎?,讓每個球員穿線似乎更容易,所以裁判可以將他們叫醒。 – xvan

回答

2

有幾個選擇,但忙等待是最嚴重的。你可以考慮一個基於共享信號量的解決方案,但我會選擇一個基於管道的解決方案。一個進程將阻止在一個打開的文件描述符上執行一個讀操作,目前沒有數據可用,所以這是一個簡單的方法,讓各個進程相互等待,以便輪流執行。

只需在裁判進程和每個玩家進程之間的每個方向創建管道。在每一回閤中,每個玩家進程試圖從裁判讀取一個字節。直到裁判寫了一些東西到管道末端,它纔會繼續。作爲獎勵,所寫入的字節可以傳達額外的數據/指令,以便例如區分「做遊戲」和「遊戲結束」。當然,相同類型的同步也適用於其他方向。

1

由於您想使用單獨的流程,因此您需要的一種方法是使用屏障。你已經有一個「控制器」的過程,玩家有一個簡單的狀態行爲(等待一個回合,玩一回合)。控制器進程(裁判員,就像你所說的那樣)可以指示孩子處理比賽的狀態,並在屏障上同步一切。

下面是一個簡單的版本的僞代碼:

// Controller 
while (game_running) { 
    barrier 1 
    // wait for player1 
    barrier 2 
    // wait for player2 
} 

// Player 1 
while (game_running) { 
    barrier 1 // Sinchronize with controller 
    // do stuff 
    barrier 2 
} 

// Player2 
while (game_running) { 
    barrier 1 // Wait for player1 
    barrier 2 
    // do stuff 
} 

一些額外的障礙很可能需要允許控制器處理來自玩家的數據,然後同步的球員,但這是控制的基本機制多個球員。

有關由Linux API提供的屏障功能的更多詳情,請點擊此鏈接:http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_barrier_wait.html

+0

我不認爲障礙是這份工作的正確同步原語。他們通常使用或多或少與線程輪流相反 - 它們用於在同步點收集線程,直到足夠到達那裏,然後讓它們全部一起進行。 –

+0

此外,我不確定(並沒有找到任何文檔)跨多個進程工作的Pthreads屏障實現。 –