• <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高潮av无码av喷吹| 久久午夜无码鲁丝片秋霞 | 久久激情五月丁香伊人| 久久国产精品一区| 久久亚洲中文字幕精品一区| 久久成人国产精品| 久久久久一本毛久久久| 久久精品国产亚洲av水果派| 国产亚洲色婷婷久久99精品91| 精品久久久一二三区| 久久免费视频网站| 精品国产99久久久久久麻豆| 99久久无码一区人妻| 久久精品中文无码资源站| 国产精品gz久久久| 久久精品国产亚洲AV嫖农村妇女| 天天综合久久一二三区| 99久久国产主播综合精品 | 2022年国产精品久久久久| 亚洲国产二区三区久久| 日韩人妻无码一区二区三区久久| 国产伊人久久| 国产精品岛国久久久久| 欧美va久久久噜噜噜久久| 伊人久久五月天| 久久婷婷五月综合97色直播| 国产成人精品久久一区二区三区av| 欧美一区二区三区久久综合| 久久经典免费视频| 久久久久久久久久久久久久| 久久久久久久综合日本| 久久久久久久久久久免费精品| 91精品国产91久久久久久蜜臀| 狠狠色婷婷综合天天久久丁香 | 久久综合亚洲鲁鲁五月天| 久久e热在这里只有国产中文精品99 | 久久亚洲2019中文字幕| 久久99精品久久久久久噜噜| 久久久久一本毛久久久| 久久综合一区二区无码| 国产精品久久久久久久人人看|