atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
TLA+メモ@ウィキ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
TLA+メモ@ウィキ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
TLA+メモ@ウィキ
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • TLA+メモ@ウィキ
  • 食事する哲学者の問題

TLA+メモ@ウィキ

食事する哲学者の問題

最終更新:2023年05月28日 22:20

tlaplus

- view
メンバー限定 登録/ログイン

食事する哲学者の問題


食事する哲学者の問題は、並行性や同期の問題を理解するための古典的な問題でエドガー・ダイクストラによって1965年に提唱された。

問題の設定は次のとおり

5人の哲学者が円形のテーブルを囲んで座っています。彼らの前にはスパゲティの皿があり、哲学者たちの間にはフォークが5本あります。哲学者は次の2つの活動を繰り返します:思索と食事。しかし、食事をするためには、彼の左右のフォークの両方を使う必要があります。

この問題は、すべての哲学者が同時に食事を始めようとすると、各哲学者が左右のフォークを1本ずつしか持てず、食事を始めるためには2本必要なため、デッドロック(行き詰まり)が発生する可能性があることを示す。


モデル

------------------------ MODULE Dining_Philosophers ------------------------
 
EXTENDS Integers, Sequences, TLC
 
(*--algorithm sample {
 (* グローバル変数宣言 *)
 (* フォークの初期状態は置かれた状態 *)
variables forks = [i \in 1..5 |-> "down"];
 
(* プロセス *)
process (philosopher \in 1..5)
(* selfは自身のプロセス番号を示す特別な変数*)
variables left = self, right = (self % 5) + 1;
{
    Thinking:
        skip;
    (* 左のフォークを持つ *)
    PickUpLeft:
        await forks[left] = "down";
        forks[left] := "up";
    (* 右のフォークを持つ *)
    PickUpRight:
        await forks[right] = "down";
        forks[right] := "up";
    Eating:
        skip;
    (* 右、左の順でフォークを置く *)
    PutDownRight:
        forks[right] := "down";
    PutDownLeft:
        forks[left] := "down";
        (* 初期に戻る *)
        goto Thinking;
};
 
}*)
\* BEGIN TRANSLATION
VARIABLES forks, pc, left, right
 
vars == << forks, pc, left, right >>
 
ProcSet == (1..5)
 
Init == (* Global variables *)
        /\ forks = [i \in 1..5 |-> "down"]
        (* Process philosopher *)
        /\ left = [self \in 1..5 |-> self]
        /\ right = [self \in 1..5 |-> (self % 5) + 1]
        /\ pc = [self \in ProcSet |-> "Thinking"]
 
Thinking(self) == /\ pc[self] = "Thinking"
                  /\ TRUE
                  /\ pc' = [pc EXCEPT ![self] = "PickUpLeft"]
                  /\ UNCHANGED << forks, left, right >>
 
PickUpLeft(self) == /\ pc[self] = "PickUpLeft"
                    /\ forks[left[self]] = "down"
                    /\ forks' = [forks EXCEPT ![left[self]] = "up"]
                    /\ pc' = [pc EXCEPT ![self] = "PickUpRight"]
                    /\ UNCHANGED << left, right >>
 
PickUpRight(self) == /\ pc[self] = "PickUpRight"
                     /\ forks[right[self]] = "down"
                     /\ forks' = [forks EXCEPT ![right[self]] = "up"]
                     /\ pc' = [pc EXCEPT ![self] = "Eating"]
                     /\ UNCHANGED << left, right >>
 
Eating(self) == /\ pc[self] = "Eating"
                /\ TRUE
                /\ pc' = [pc EXCEPT ![self] = "PutDownRight"]
                /\ UNCHANGED << forks, left, right >>
 
PutDownRight(self) == /\ pc[self] = "PutDownRight"
                      /\ forks' = [forks EXCEPT ![right[self]] = "down"]
                      /\ pc' = [pc EXCEPT ![self] = "PutDownLeft"]
                      /\ UNCHANGED << left, right >>
 
PutDownLeft(self) == /\ pc[self] = "PutDownLeft"
                     /\ forks' = [forks EXCEPT ![left[self]] = "down"]
                     /\ pc' = [pc EXCEPT ![self] = "Thinking"]
                     /\ UNCHANGED << left, right >>
 
philosopher(self) == Thinking(self) \/ PickUpLeft(self)
                        \/ PickUpRight(self) \/ Eating(self)
                        \/ PutDownRight(self) \/ PutDownLeft(self)
 
(* Allow infinite stuttering to prevent deadlock on termination. *)
Terminating == /\ \A self \in ProcSet: pc[self] = "Done"
               /\ UNCHANGED vars
 
Next == (\E self \in 1..5: philosopher(self))
           \/ Terminating
 
Spec == Init /\ [][Next]_vars
 
Termination == <>(\A self \in ProcSet: pc[self] = "Done")
 
\* END TRANSLATION
 

解説

このコードは、問題の基本的なモデルでデッドロック(全哲学者が同時にフォークを拾おうとして行き詰まる状態)やリソースの競合(隣接する哲学者が同じフォークを必要とする状態)などの問題を解決する対策は含まれていない。このモデルをモデルチェッカで検査するとデッドロックが検出される。
「食事する哲学者の問題」をウィキ内検索
LINE
シェア
Tweet

[Amazon商品]


TLA+メモ@ウィキ
記事メニュー

メニュー

  • トップページ
  • TLA+とは
  • ボイラープレート
  • 型 (Type)
  • 文法 (Syntax)
  • PlusCal構文
  • 時相論理 (temporal logic)
  • TLA+ TooolBox
  • よく使う表現
  • 例題


リンク

  • The TLA+ Home Page
  • TLA+ Foundation
  • TLA+ GitHub
  • TLA+ Video Course (YouTube)
  • Learn TLA+
  • @wiki
  • @wikiご利用ガイド


アクセス

今日: -
昨日: -
合計: -


ここを編集
記事メニュー2

人気のページ

  • TLA+とは
  • PlusCal構文
  • 食事する哲学者の問題
  • トップページ
  • 型 (Type)
  • 例題
  • 文法 (Syntax)
  • 時相論理 (temporal logic)
  • うそつき牛(レイトン教授)
  • ボイラープレート

更新履歴


編集履歴

取得中です。

ここを編集
最近更新されたページ
  • 68日前

    TLA+とは
  • 68日前

    メニュー
  • 444日前

    PlusCal構文
  • 628日前

    型 (Type)
  • 629日前

    時相論理 (temporal logic)
  • 646日前

    文法 (Syntax)
  • 784日前

    川渡り問題
  • 785日前

    例題
  • 789日前

    うそつき牛(レイトン教授)
  • 789日前

    食事する哲学者の問題
もっと見る
最近更新されたページ
  • 68日前

    TLA+とは
  • 68日前

    メニュー
  • 444日前

    PlusCal構文
  • 628日前

    型 (Type)
  • 629日前

    時相論理 (temporal logic)
  • 646日前

    文法 (Syntax)
  • 784日前

    川渡り問題
  • 785日前

    例題
  • 789日前

    うそつき牛(レイトン教授)
  • 789日前

    食事する哲学者の問題
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  2. MadTown GTA (Beta) まとめウィキ
  3. R.E.P.O. 日本語解説Wiki
  4. シュガードール情報まとめウィキ
  5. ソードランページ @ 非公式wiki
  6. AviUtl2のWiki
  7. Dark War Survival攻略
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. ありふれた職業で世界最強 リベリオンソウル @ ウィキ
  10. 星飼いの詩@ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 鹿乃つの氏 周辺注意喚起@ウィキ
  5. 初音ミク Wiki
  6. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. 発車メロディーwiki
  8. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  9. 検索してはいけない言葉 @ ウィキ
  10. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. チンポ画像収集場 - 検索してはいけない言葉 @ ウィキ
  2. 参加者一覧 - ストグラ まとめ @ウィキ
  3. ドンキーコング バナンザ - アニヲタWiki(仮)
  4. 機体一覧 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  5. 危険度7 - 検索してはいけない言葉 @ ウィキ
  6. キングクルール - アニヲタWiki(仮)
  7. ひの らん/エピソード6 - ストグラ まとめ @ウィキ
  8. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  9. 生きたメキシコ - 検索してはいけない言葉 @ ウィキ
  10. コメント/雑談・質問 - マージマンション@wiki
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.