看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux kernel 4.1 + Raspberry pi 1 + gcc 4.8 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) pthread 問題(Question): 最近從板上學到atomic operation 好奇搜尋了一下atomic operation跟pthread mutex的執行速度比較 https://www.arangodb.com/2015/02/comparing-atomic-mutex-rwlocks/ 我用RPi跑的結果,mutex需要的時間比g++ atomic多出3-4倍 我的疑問是,既然atomic operation這麼好用, 那以後可以不用mutex直接用atomic operation嗎? (我目前是用gcc bulti-in sync operation) 我自己看mutex的原理好像就是嚴格跟複雜一點的atomic operation? 1.以我自己的理解,在單核系統atomic operation應該可以替代mutex? (同一時間只有一個thread能run的情況下,應該比較容易同步吧?) 還是我考慮的太少? 2.使用pthread_cond_wait和pthread_cond_signal 的情況下 一般都是用mutex來配合,如果我改用atomic operation的test and set來作OK嗎? 3.在多核的情況下,mutex是唯一解嗎? 還是這跟同時間企圖讀寫該critical section 的thread數目有關? 這好像應該是作業系統的問題? 如果有違板規請告知 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.214.241 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1446454953.A.4B8.html
LiloHuang: std::atomic<T> 只能用來保護 integer data types 11/02 18:23
LiloHuang: 底下會使用 lock cmpxchg 的等指令來實作 11/02 18:23
LiloHuang: atomic 操作可延伸實作出 lockfree container 11/02 18:24
LiloHuang: boost::lockfree::queue 就是一個好例子 11/02 18:24
LiloHuang: 如果你要保護的是一段程式碼,那就是 spin lock 11/02 18:24
LiloHuang: 像是 tbb::spin_rw_mutex 是 user space mutex 11/02 18:24
LiloHuang: 多核心的系統上,如果要保護的對象是很短的幾道指令 11/02 18:25
LiloHuang: 使用 spin lock 通常效率會比較好,跑一次性能測試最準 11/02 18:25
LiloHuang: 至於用 test-and-set 來實作,有可能會 busy waiting 11/02 18:26
LiloHuang: 假設你同步的程式碼內容是要做 I/O,還是請用 mutex 11/02 18:26
Caesar08: 能用atomic就用,但你會發現atomic能支援的很少 11/02 19:51
Caesar08: 這個時候就需要用mutex了 11/02 19:51