none
執行緒是同步還是非同步 RRS feed

  • 問題

  • 最近在研究"執行緒同步處理" 與 "非同步程式設計"

    被"同步" "非同步" 搞暈囉!!

    由線上文件看來,執行緒同步指的是"處理同時處理共用資源",實際上執行緒程式開發是非同步的,如背景元件被規在非同步.

    1.想請問上述觀念是否正確??

    2.但是中文字面上解釋,同步好像可以指"同時"間做動作,那麼主執行緒產生兩個子執行同時各自處理自己的事,這樣又好像是同步??

     

    所以想請問 執行緒程式開發是"同步" 還是 "非同步"??

    2010年5月30日 上午 06:59

解答

  • 白話文來講, 同步與非同步是指是否會鎖定當前執行緒, 假設有一個Sub 如下

    Private Sub X()

    A()

    B()

    End Sub

    1. 當程式執行到A(), 必須要等待A()執行完畢才會執行B(), 也就是流程是由上而下的, 則稱A()為同步方法 (也就是A()會使得原本的執行緒遭到鎖定)

    2. 當程式執行到A(), 本執行緒完全不會管A()執行完沒有, 就逕行執行B() (而且有可能B()執行完了, A()都還沒執行完), 這表示A()的執行緒是分支出來的, 也就是A()不會鎖定住Sub X()的執行流程, 則A()為非同步方法.

    詳情參閱MSDN文件庫

    [非同步程式設計模式 ]


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月30日 上午 07:21
    版主

所有回覆

  • 白話文來講, 同步與非同步是指是否會鎖定當前執行緒, 假設有一個Sub 如下

    Private Sub X()

    A()

    B()

    End Sub

    1. 當程式執行到A(), 必須要等待A()執行完畢才會執行B(), 也就是流程是由上而下的, 則稱A()為同步方法 (也就是A()會使得原本的執行緒遭到鎖定)

    2. 當程式執行到A(), 本執行緒完全不會管A()執行完沒有, 就逕行執行B() (而且有可能B()執行完了, A()都還沒執行完), 這表示A()的執行緒是分支出來的, 也就是A()不會鎖定住Sub X()的執行流程, 則A()為非同步方法.

    詳情參閱MSDN文件庫

    [非同步程式設計模式 ]


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月30日 上午 07:21
    版主
  • 謝謝大大指點,想再確認吸收完後觀念是否正鵲:

    假設main(),生成兩個子執行緒後繼續執行main()後續程式,那麼原則上就是非同步,

    除非,刻意使用流程控制(如Join),使主執行緒被鎖定達到同步效果。

    總結,如果未經同步處理的執行緒程式,原則上都是非同步的是嗎??

    2010年5月30日 上午 07:36
  • 如果未經同步處理的執行緒程式,原則上都是非同步的是嗎?? ->應改成 如果未經同步處理的多執行緒 程式,原則上都是非同步的是嗎??
    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月30日 上午 07:55
    版主