<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 功能強大 支持多語言、二開方便! 廣告
                # 同步復習題 > 原文:<https://github.com/angrave/SystemProgramming/wiki/Synchronization-Review-Questions> ## 話題 * 原子操作 * 關鍵部分 * 生產者消費者問題 * 使用條件變量 * 使用計數信號量 * 實施障礙 * 實現環形緩沖區 * 使用 pthread_mutex * 實施生產者消費者 * 分析多線程編碼 ## 問題 * 什么是原子操作? * 為什么以下不能在并行代碼中工作 ```c //In the global section size_t a; //In pthread function for(int i = 0; i < 100000000; i++) a++; ``` 這會嗎? ```c //In the global section atomic_size_t a; //In pthread function for(int i = 0; i < 100000000; i++) atomic_fetch_add(a, 1); ``` * 原子操作有哪些缺點?什么會更快:保持局部變量或許多原子操作? * 什么是關鍵部分? * 一旦確定了一個關鍵部分,確保一次只有一個線程在該部分中的一種方法是什么? * 在此確定關鍵部分 ```c struct linked_list; struct node; void add_linked_list(linked_list *ll, void* elem){ node* packaged = new_node(elem); if(ll->head){ ll->head = }else{ packaged->next = ll->head; ll->head = packaged; ll->size++; } } void* pop_elem(linked_list *ll, size_t index){ if(index >= ll->size) return NULL; node *i, *prev; for(i = ll->head; i && index; i = i->next, index--){ prev = i; } //i points to the element we need to pop, prev before if(prev->next) prev->next = prev->next->next; ll->size--; void* elem = i->elem; destroy_node(i); return elem; } ``` 你有多緊張關鍵部分? * 什么是生產者消費者問題?在上一節中如何使用上述生產者消費者問題?生產者消費者問題與讀者作家問題有什么關系? * 什么是條件變量?為什么在`while`循環上使用一個有優勢? * 為什么這段代碼很危險? ```c if(not_ready){ pthread_cond_wait(&cv, &mtx); } ``` * 什么是計數信號量?給我一個餅干罐/披薩盒/限量食品的類比。 * 什么是線程障礙? * 使用計數信號量來實現屏障。 * 編寫生產者/消費者隊列,生產者消費者棧怎么樣? * 給我一個帶條件變量的讀寫器鎖的實現,用你需要的任何東西制作一個結構,它只需要能夠支持以下函數 ```c void reader_lock(rw_lock_t* lck); void writer_lock(rw_lock_t* lck); void reader_unlock(rw_lock_t* lck); void writer_unlock(rw_lock_t* lck); ``` 唯一的規范是在`reader_lock`和`reader_unlock`之間,沒有編寫者可以寫。在寫入器鎖之間,一次只能寫一個作者。 * 編寫代碼以使用僅三個計數信號量來實現生產者使用者。假設可以有多個線程調用 enqueue 和 dequeue。確定每個信號量的初始值。 * 編寫代碼以使用條件變量和互斥鎖實現生產者使用者。假設可以有多個線程調用 enqueue 和 dequeue。 * 使用 CV 實現 add(unsigned int)和 subtract(unsigned int)阻塞函數,這些函數永遠不會允許全局值大于 100。 * 使用 CV 為 15 個線程實現屏障。 * 以下有多少陳述是正確的? * 可以有多個活躍的讀者 * 可以有多個活動作者 * 當有活動的寫入器時,活動讀取器的數量必須為零 * 如果有活動的閱讀器,則活動寫入器的數量必須為零 * 作者必須等到當前活躍的讀者完成 * Todo:分析多線程代碼片段
                  <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>

                              哎呀哎呀视频在线观看