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+ GitHub
  • TLA+ Video Course (YouTube)
  • Learn TLA+
  • @wiki
  • @wikiご利用ガイド


アクセス

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


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

人気のページ

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

更新履歴


編集履歴

取得中です。

ここを編集
人気記事ランキング
  1. TLA+ TooolBox
  2. TLA+とは
  3. ボイラープレート
  4. よく使う表現
  5. PlusCal構文
もっと見る
最近更新されたページ
  • 371日前

    PlusCal構文
  • 492日前

    メニュー
  • 555日前

    型 (Type)
  • 556日前

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

    文法 (Syntax)
  • 711日前

    川渡り問題
  • 712日前

    例題
  • 716日前

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

    食事する哲学者の問題
  • 717日前

    右メニュー
もっと見る
人気記事ランキング
  1. TLA+ TooolBox
  2. TLA+とは
  3. ボイラープレート
  4. よく使う表現
  5. PlusCal構文
もっと見る
最近更新されたページ
  • 371日前

    PlusCal構文
  • 492日前

    メニュー
  • 555日前

    型 (Type)
  • 556日前

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

    文法 (Syntax)
  • 711日前

    川渡り問題
  • 712日前

    例題
  • 716日前

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

    食事する哲学者の問題
  • 717日前

    右メニュー
もっと見る
ウィキ募集バナー
新規Wikiランキング

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

  1. R.E.P.O. 日本語解説Wiki
  2. VCR GTA3まとめウィキ
  3. ドタバタ王子くん攻略サイト
  4. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  5. STAR WARS ジェダイ:サバイバー攻略 @ ウィキ
  6. ありふれた職業で世界最強 リベリオンソウル @ ウィキ
  7. アサシンクリードシャドウズ@ ウィキ
  8. パズル&コンクエスト(Puzzles&Conquest)攻略Wiki
  9. ドラゴンボール Sparking! ZERO 攻略Wiki
  10. SYNDUALITY Echo of Ada 攻略 ウィキ
もっと見る
人気Wikiランキング

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

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. oblivion xbox360 Wiki
  5. 初音ミク Wiki
  6. 検索してはいけない言葉 @ ウィキ
  7. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  8. SDガンダム ジージェネレーションクロスレイズ 攻略Wiki
  9. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  10. 英傑大戦wiki
もっと見る
全体ページランキング

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

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. 鬼レンチャン(レベル順) - 鬼レンチャンWiki
  3. 発車メロディー変更履歴 - 発車メロディーwiki
  4. クエスト - oblivion xbox360 Wiki
  5. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  6. 雑談・交流掲示板 - 星の翼(Starward) 日本語wiki @ ウィキ
  7. ロスサントス警察 - ストグラ まとめ @ウィキ
  8. SCP-8045 - アニヲタWiki(仮)
  9. 魔法屋 - oblivion xbox360 Wiki
  10. 乗り物一覧 - Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
もっと見る

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

2019 AtWiki, Inc.