C#與死結 (Deadlock)

作品

書籍

課程

程式集

小說集

論文集

散文集

影片集

編輯雜誌

程式人

電子書

JavaScript

計算語言學

微積分

Blender 動畫

C# 語言

系統程式

高等 C 語言

Java

Android

Verilog

Wikidot

R 統計軟體

機率統計

計算機數學

組合語言

人工智慧

開放原始碼

網路資源運用

計算機結構

相關訊息

常用工具

友站連結

在家教育

RSS

最新修改

網頁列表

簡體版

English

簡介

在作業系統的課程當中我們會學到『死結』這個問題,當程式 1 抓住資源 A,卻又在等程式 2 釋放資源 B,而程式 2 則抓住資源 B ,卻又在等程式 1 釋放資源 A 的時候,就會進入死結狀態。下圖顯示了這種死結情況的示意圖。

deadlock.svg

圖一、死結的示意圖

在程式設計中我們真的會遇到死結嗎?如果真的有死結,能否寫一個會造成死結的程式呢?

這並不難,只要用執行緒 (Thread) 與鎖定 (lock) 機制,我們很容易就可以造出會導致死結的程式,以下是我們用 C# 撰寫的一段死結程式,請參考。

using System;
using System.Threading;
using System.Text;

class ThreadTest
{
    static StringBuilder A = new StringBuilder("A");
    static StringBuilder B = new StringBuilder("B");

    public static void Main(String[] args)
    {
        Thread thread1 = new Thread(new ThreadStart(AB));
        Thread thread2 = new Thread(new ThreadStart(BA));
        thread1.Start();
        thread2.Start();
        thread1.Join();
        thread2.Join();
    }

    public static void AB()
    {
        lock (A)
        {
            Console.WriteLine("AB.lock(A)");
            Thread.Sleep(1000);
            lock (B)
            {
                Console.WriteLine("AB.lock(B)");
            }
        }
    }

    public static void BA()
    {
        lock (B)
        {
            Console.WriteLine("BA.lock(B)");
            Thread.Sleep(1000);
            lock (A)
            {
                Console.WriteLine("BA.lock(A)");
            }
        }
    }
}

上述程式的執行結果如下圖所示,當程式跑到 BA.lock(B) 之後就進入了死結,再也無法跑下去了,因此我們不會看到 BA.lock(A) 與 AB.lock(B) 這兩行輸出的結果,程式已經進入了死結狀態,再也出不來了。

CsDeadlockRun.jpg

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License