• <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 閱讀(250) 評論(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()盡管通過加鎖的方式能保證線程安全,但是由于函數體對共享資源的訪問,因此是非可重入。

            欧美亚洲国产精品久久高清 | 久久成人精品| 欧美久久一级内射wwwwww.| 日韩精品久久久久久久电影| 久久亚洲私人国产精品| 国产69精品久久久久9999| 欧美黑人激情性久久| 国内精品人妻无码久久久影院| 精品无码久久久久久久久久| 亚洲欧美国产日韩综合久久| 狠狠人妻久久久久久综合蜜桃| 久久精品国产AV一区二区三区| 亚洲国产成人乱码精品女人久久久不卡| 久久久久亚洲av成人网人人软件| 亚洲成色999久久网站| www.久久精品| 久久99热国产这有精品| 久久久久久亚洲AV无码专区| 久久亚洲私人国产精品| 日本欧美国产精品第一页久久| 国产精品久久久福利| 久久99九九国产免费看小说| 精品久久国产一区二区三区香蕉| 99久久精品日本一区二区免费| 国内精品久久国产| 日本精品久久久久久久久免费| 91久久精品电影| 亚洲一本综合久久| 国产亚洲婷婷香蕉久久精品| 国产精品久久久亚洲| 色妞色综合久久夜夜| 波多野结衣AV无码久久一区| 亚洲国产精品无码成人片久久| 久久99精品国产自在现线小黄鸭 | 亚洲精品无码久久千人斩| 午夜视频久久久久一区| 久久人人超碰精品CAOPOREN| 久久久久亚洲AV无码专区首JN| 久久夜色撩人精品国产| 亚洲午夜福利精品久久| 一本色道久久综合狠狠躁篇 |