<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 互斥 互斥是多線程系統中用于控制訪問的一個原對象(primitive object)。下面的例子給出了它最基本的用法: ``` std::mutex m; int sh; //共享數據 // … m.lock(); // 對共享數據進行操作: sh += 1; m.unlock(); ``` 在任何時刻,最多只能有一個線程執行到lock()和unlock()之間的區域(通常稱為臨界區)。當第一個線程正在臨界區執行時,后續執行到m.lock()的線程將會被阻塞直到第一個進程執行到m.unlock()。這個過程比較簡單,但是如何正確使用互斥并不簡單。錯誤地使用互斥將會導致一系列嚴重后果。大家可以設想以下情形所導致的后果:一個線程只進行了lock()而沒有執行相應unlock(); 一個線程對同一個mutex對象執行了兩次lock()操作;一個線程在等待unlock()操作時被阻塞了很久;一個線程需要對兩個mutex對象執行lock()操作后才能執行后續任務。可以在很多書(譯者注:通常操作系統相關書籍中會講到)中找到這些問題的答案。在這里(包括Locks section一節)所給出的都是一些入門級別的。 除了lock(),mutex還提供了try_lock()操作。線程可以借助該操作來嘗試進入臨界區,這樣一來該線程不會在失敗的情況下被阻塞。下面例子給出了try_lock()的用法: ``` std::mutex m; int sh; //共享數據 // … if (m.try_lock()) { //操作共享數據 sh += 1; m.unlock(); } else { //可能在試圖進入臨界區失敗后執行其它代碼 } ``` recursive_mutex是一種能夠被同一線程連續鎖定多次的mutex。下面是recursive_mutex的一個實例: ``` std::recursive_mutex m; int sh; //共享數據 //.. void f(int i) { //… m.lock(); //對共享數據進行操作 sh += 1; if (–i>0) f(i); //注意:這里對f(i)進行了遞歸調用, //將導致在m.unlock()之前多次執行m.lock() m.unlock(); //… } ``` 對于這點,我曾經夸耀過并且用f()調用它自身。一般地,代碼會更加微妙。這是因為代碼中經常會有間接遞歸調用。比如f()調用g(),而g()又調用了h(),最后h()又調用了f(),這樣就形成了一個間接遞歸。 如果我想在未來的10秒內進入到一個mutex所劃定的臨界區,該如果實現? timed_mutex類可以解決這個問題。事實上,關于它的使用可以被看做是關聯了時間限制的try_lock()的一個特例。 ``` std::timed_mutex m; int sh; //共享數據 //… if ( m.try_lock_for(std::chrono::seconds(10))) { //對共享數據進行操作 sh += 1; m.unlock(); } else { //進入臨界區失敗,在此執行其它代碼 } ``` try_lock_for()的參數是一個用相對時間表示的duration。如果你不想這么做而是想等到一個固定的時間點:一個time_point,你可以使用try_lock_until(): ``` std::timed_mutex m; int sh; //共享數據 // … if ( m.try_lock_until(midnight)) { //對共享數據進行操作 sh += 1; m.unlock(); } else { //進入臨界區失敗,在此執行其它代碼 } ``` 這里使用midnight是一個冷笑話:對于mutex級別的操作,相應的時間是毫秒級別的而不是小時。 當然地,C++0x中也有recursive_timed_mutex。 mutex可以被看做是一個資源(因為它經常被用來代表一種真實的資源),并且當它對至少兩個線程可見時它才是有用的。必然地,mutex不能被復制或者移動(正如你不能復制一個硬件的輸入寄存器)。 令人驚訝地,實際中經常很難做到lock()s與unlock()s的匹配。設想一下那些復雜的控制結構,錯誤以及異常,要做到匹配的確比較困難。如果你可以選擇使用locks去管理你的互斥,這將為你和你的用戶節省大量的時間,再也不用熬夜通宵徹夜無眠了。(that will save you and your users a lot of sleep??)。 同時可參考: * Standard: 30.4 Mutual exclusion [thread.mutex] * H. Hinnant, L. Crowl, B. Dawes, A. Williams, J. Garland, et al.: [Multi-threading Library for Standard C++ (Revision 1)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2320.html) * ??? (翻譯:Yibo Zhu)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看