• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            轉帖 可重入和線程安全

            Posted on 2010-03-12 14:33 rikisand 閱讀(253) 評論(0)  編輯 收藏 引用

               首先,可重入和線程安全是兩個并不等同的概念,一個函數可以是可重入的,也可以是線程安全的,可以兩者均滿足,可以兩者皆不滿組(該描述嚴格的說存在漏洞,參見第二條)。
                其次,從集合和邏輯的角度看,可重入是線程安全的子集,可重入是線程安全的充分非必要條件。可重入的函數一定是線程安全的,然過來則不成立。
                第三,POSIX 中對可重入和線程安全這兩個概念的定義:
            Reentrant Function:
                A function whose effect, when called by two or more threads,is guaranteed to be as if the threads each executed thefunction one after another in an undefined order, even ifthe actual execution is interleaved.
                                                                                                                    From IEEE Std 1003.1-2001 (POSIX 1003.1)
                                                                                                                                                  -- Base Definitions, Issue 6
            Thread-Safe Function:
                A function that may be safely invoked concurrently by multiple threads.
               另外還有一個 Async-Signal-Safe的概念
            Async-Signal-Safe Function:
                A function that may be invoked, without restriction fromsignal-catching functions. No function is async-signal -safe unless explicitly described as such.
                以上三者的關系為:
            Reentrant Function 必然是Thread-Safe Function和Async-Signal-Safe Function
            可重入與線程安全的區別體現在能否在signal處理函數中被調用的問題上,可重入函數在signal處理函數中可以被安全調用,因此同時也是Async-Signal-Safe Function;而線程安全函數不保證可以在signal處理函數中被安全調用,如果通過設置信號阻塞集合等方法保證一個非可重入函數不被信號中斷,那么它也是Async-Signal-Safe Function。
                 值得一提的是POSIX 1003.1的System Interface缺省是Thread-Safe的,但不是Async-Signal-Safe的。Async-Signal-Safe的需要明確表示,比如fork ()和signal()。
            最后讓我們來構想一個線程安全但不可重入的函數:
               假設函數func()在執行過程中需要訪問某個共享資源,因此為了實現線程安全,在使用該資源前加鎖,在不需要資源解鎖。
               假設該函數在某次執行過程中,在已經獲得資源鎖之后,有異步信號發生,程序的執行流轉交給對應的信號處理函數;再假設在該信號處理函數中也需要調用函數func(),那么func()在這次執行中仍會在訪問共享資源前試圖獲得資源鎖,然而我們知道前一個func()實例已然獲得該鎖,因此信號處理函數阻塞——另一方面,信號處理函數結束前被信號中斷的線程是無法恢復執行的,當然也沒有釋放資源的機會,這樣就出現了線程和信號處理函數之間的死鎖局面。
                因此,func()盡管通過加鎖的方式能保證線程安全,但是由于函數體對共享資源的訪問,因此是非可重入。

            成人妇女免费播放久久久| 亚洲人成无码久久电影网站| 久久国语露脸国产精品电影| 久久久久国色AV免费观看| 一本色综合久久| 亚洲伊人久久精品影院| 蜜臀久久99精品久久久久久| 热re99久久精品国99热| 欧美国产成人久久精品| 少妇精品久久久一区二区三区| 久久久久香蕉视频| 国产麻豆精品久久一二三| 久久久久国产日韩精品网站| 一本久久a久久精品vr综合| 久久综合中文字幕| 亚洲国产精品18久久久久久| 久久精品www| 久久精品国产久精国产| 久久久久久久91精品免费观看| 99久久成人18免费网站| 99精品久久精品| 国内精品久久久人妻中文字幕| 亚洲国产成人精品久久久国产成人一区二区三区综 | 99精品久久久久久久婷婷| 亚洲欧美精品伊人久久| 无码AV波多野结衣久久| 99久久香蕉国产线看观香| 久久精品中文字幕大胸| 精品人妻伦九区久久AAA片69| 国产精品VIDEOSSEX久久发布| 99久久99久久精品国产片果冻| 欧美一区二区三区久久综合| 久久人人添人人爽添人人片牛牛| 国产巨作麻豆欧美亚洲综合久久| 久久99精品国产一区二区三区| 久久国产精品成人片免费| 久久精品人人槡人妻人人玩AV| 精品久久久无码21p发布| 少妇人妻综合久久中文字幕| 久久婷婷午色综合夜啪| 精品国产青草久久久久福利|