<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 問題描述 有讀者和寫者兩組并發進程,共享一個文件,當兩個或以上的讀進程同時訪問共享數據時不會產生副作用,但若某個寫進程和其他進程(讀進程或寫進程)同時訪問共享數據時則可能導致數據不一致的錯誤。因此要求:①允許多個讀者可以同時對文件執行讀操作;②只允許一個寫者往文件中寫信息;③任一寫者在完成寫操作之前不允許其他讀者或寫者工作;④寫者執行寫操作前,應讓已有的讀者和寫者全部退出。 ## 問題分析 1) 關系分析。由題目分析讀者和寫者是互斥的,寫者和寫者也是互斥的,而讀者和讀者不存在互斥問題。 2) 整理思路。兩個進程,即讀者和寫者。寫者是比較簡單的,它和任何進程互斥,用互斥信號量的P操作、V操作即可解決。讀者的問題比較復雜,它必須實現與寫者互斥的同時還要實現與其他讀者的同步,因此,僅僅簡單的一對P操作、V操作是無法解決的。那么,在這里用到了一個計數器,用它來判斷當前是否有讀者讀文件。當有讀者的時候寫者是無法寫文件的,此時讀者會一直占用文件,當沒有讀者的時候寫者才可以寫文件。同時這里不同讀者對計數器的訪問也應該是互斥的。 3) 信號量設置。首先設置信號量count為計數器,用來記錄當前讀者數量,初值為0; 設置mutex為互斥信號量,用于保護更新count變量時的互斥;設置互斥信號量rw用于保證讀者和寫者的互斥訪問。 代碼如下: ``` int count=0; //用于記錄當前的讀者數量 semaphore mutex=1; //用于保護更新count變量時的互斥 semaphore rw=1; //用于保證讀者和寫者互斥地訪問文件 writer () { //寫者進程 while (1){ P(rw); // 互斥訪問共享文件 Writing; //寫入 V(rw) ; //釋放共享文件 } } reader () { // 讀者進程 while(1){ P (mutex) ; //互斥訪問count變量 if (count==0) //當第一個讀進程讀共享文件時 P(rw); //阻止寫進程寫 count++; //讀者計數器加1 V (mutex) ; //釋放互斥變量count reading; //讀取 P (mutex) ; //互斥訪問count變量 count--; //讀者計數器減1 if (count==0) //當最后一個讀進程讀完共享文件 V(rw) ; //允許寫進程寫 V (mutex) ; //釋放互斥變量 count } } ``` 在上面的算法中,讀進程是優先的,也就是說,當存在讀進程時,寫操作將被延遲,并且只要有一個讀進程活躍,隨后而來的讀進程都將被允許訪問文件。這樣的方式下,會導致寫進程可能長時間等待,且存在寫進程“餓死”的情況。 如果希望寫進程優先,即當有讀進程正在讀共享文件時,有寫進程請求訪問,這時應禁止后續讀進程的請求,等待到已在共享文件的讀進程執行完畢則立即讓寫進程執行,只有在無寫進程執行的情況下才允許讀進程再次運行。為此,增加一個信號量并且在上面的程序中 writer()和reader()函數中各增加一對PV操作,就可以得到寫進程優先的解決程序。 ``` int count = 0; //用于記錄當前的讀者數量 semaphore mutex = 1; //用于保護更新count變量時的互斥 semaphore rw=1; //用于保證讀者和寫者互斥地訪問文件 semaphore w=1; //用于實現“寫優先” writer(){ while(1){ P(w); //在無寫進程請求時進入 P(rw); //互斥訪問共享文件 writing; //寫入 V(rw); // 釋放共享文件 V(w) ; //恢復對共享支件的訪問 } } reader () { //讀者進程 while (1){ P (w) ; // 在無寫進程請求時進入 P (mutex); // 互斥訪問count變量 if (count==0) //當第一個讀進程讀共享文件時 P(rw); //阻止寫進程寫 count++; //讀者計數器加1 V (mutex) ; //釋放互斥變量count V(w); //恢復對共享文件的訪問 reading; //讀取 P (mutex) ; //互斥訪問count變量 count--; //讀者計數器減1 if (count==0) //當最后一個讀進程讀完共享文件 V(rw); //允許寫進程寫 V (mutex); //釋放互斥變量count } } ```
                  <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>

                              哎呀哎呀视频在线观看