作者wtchen (沒有存在感的人)
看板C_and_CPP
標題[問題] atomic operation 可以完全取代mutex嗎
時間Mon Nov 2 17:02:27 2015
開發平台(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