同步操作練習題 (Practice - Synchronizing Operations)


Question 1 - 條件變數與 unique_lock [recall]

為什麼 std::condition_variable::wait() 必須搭配 std::unique_lock 而非 std::lock_guard?「虛假喚醒」又是什麼、該如何應對?


Question 2 - 啟動策略 [recall]

std::launch::asyncstd::launch::deferred 有何差異?std::async 不指定策略時的預設行為是什麼?


Question 3 - 三種建立 future 的方式 [recall]

列出三種讓 std::future 與非同步結果關聯的方式,並說明各自的適用情境。


Question 4 - future vs shared_future [recall]

多個執行緒要等待同一個非同步結果,直接共用一個 std::future 會有什麼問題?正確做法為何?


Question 5 - 三種時鐘 [recall]

C++ 標準庫提供哪三種時鐘?計算超時應該用哪一個?為什麼?


Question 6 - latch vs barrier [recall]

比較 latch 與 barrier:可重用性、對「誰來遞減/到達」的要求,以及 flex_barrier 額外提供什麼?


Question 7 - 把例外傳給呼叫端 [application]

square_root(-1) 會拋出 std::out_of_range。現在要把它移到另一個執行緒執行,並讓呼叫端在取結果時看到這個例外。寫出兩種做法,並說明「promise 沒設值就銷毀」會發生什麼。


Question 8 - 限時等待迴圈 [application]

用條件變數等待 done 旗標,但整體最多等 500ms。應該用 wait_for 還是 wait_until?寫出核心迴圈並說明理由。


Question 9 - parallel_quick_sort 的執行緒爆炸 [analysis]

parallel_quick_sort 對 lower 半部遞迴呼叫 std::async。分析遞迴 10 層時的執行緒規模與效能風險、預設啟動策略下運行庫如何緩解,以及改用 spawn_task(packaged_task + thread + detach)為何反而更糟。


Question 10 - when_all vs async 輪詢收集 [analysis]

比較「用 std::async 產生收集任務、逐一 f.get()(代碼 4.22)」與「when_all + .then(代碼 4.23)」的資源使用差異。什麼情況下應改用 when_any?