[問題] bool變數一寫多讀需要鎖嗎

看板C_and_CPP (C/C++)作者 (SFGEX)時間3周前 (2026/02/11 21:04), 2周前編輯推噓6(6028)
留言34則, 8人參與, 1天前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 64 位元指令集 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) gcc 問題(Question): bool型別之類的簡單變數 Single Store & Multiple Load本身有組合語言層級的原子性保證 請問~~ 所以有做好memory barrier的前提下 一寫多讀bool是不是完全不用鎖? 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) Writer thread: do_something(); smp_wmb(); global_flag = true; Multiple Reader threads: if (global_flag) { smp_rmb() do_other_things() } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.27.23.35 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1770815053.A.A5A.html ※ 編輯: SFGEX (114.27.23.35 臺灣), 02/11/2026 21:20:20

02/12 00:10, 3周前 , 1F
我想請問一下,你是怎麼知道bool型別支援single write
02/12 00:10, 1F

02/12 00:10, 3周前 , 2F
和 multiple load?
02/12 00:10, 2F

02/12 00:19, 3周前 , 3F
02/12 00:19, 3F

02/12 00:19, 3周前 , 4F
uage/memory_model.html
02/12 00:19, 4F

02/12 00:20, 3周前 , 5F
這一段話:When an汢valuation漑f an expression writ
02/12 00:20, 5F

02/12 00:21, 3周前 , 6F
When an汢valuation of an expression writes to a me
02/12 00:21, 6F

02/12 00:21, 3周前 , 7F
and another evaluation reads or modifies the same
02/12 00:21, 7F

02/12 00:21, 3周前 , 8F
memory location, the expressions are said to氲onf
02/12 00:21, 8F

02/12 00:25, 3周前 , 9F
所以data race 是只要有一個 write 搭配其它 read 或w
02/12 00:25, 9F

02/12 00:25, 3周前 , 10F
rite 就會是發生。
02/12 00:25, 10F

02/12 01:50, 3周前 , 11F
另外, 就算 x86 組合語言只有一條, CPU 微指令可能有好幾條
02/12 01:50, 11F

02/12 07:19, 2周前 , 12F
請問這題適合轉 Linux 板嗎?
02/12 07:19, 12F

02/12 14:40, 2周前 , 13F
應該說我只知道賦值跟讀變數都只有一條組語
02/12 14:40, 13F

02/12 14:40, 2周前 , 14F
但複雜操作例如++ , swap會有多條 一定不行
02/12 14:40, 14F

02/12 14:47, 2周前 , 15F
然後store load 即使底下還有微指令
02/12 14:47, 15F

02/12 14:47, 2周前 , 16F
讀寫這個快取上byte也是原子性的
02/12 14:47, 16F

02/12 14:47, 2周前 , 17F
不會說store更新了4bit還有4bit沒更新
02/12 14:47, 17F

02/12 14:48, 2周前 , 18F
其他cpu 或是同一個cpu load這塊快取要馬新要馬舊
02/12 14:48, 18F

02/12 14:49, 2周前 , 19F
應該是整個8bit 全舊全新選一個而已?
02/12 14:49, 19F
SFGEX:轉錄至看板 Linux 02/12 14:49 ※ 編輯: SFGEX (223.136.48.119 臺灣), 02/12/2026 14:58:20

02/12 18:48, 2周前 , 20F
你用atomic寫然後看assembly吧
02/12 18:48, 20F

02/13 22:31, 2周前 , 21F
其實我認為,為了維持程式在不同軟硬體平台上的行為一
02/13 22:31, 21F

02/13 22:31, 2周前 , 22F
致,
02/13 22:31, 22F

02/13 22:33, 2周前 , 23F
都應該要根據C spec所敘述的性質,
02/13 22:33, 23F

02/13 22:34, 2周前 , 24F
使用atomic type/atomic operation進行操作,
02/13 22:34, 24F

02/13 22:38, 2周前 , 25F
畢竟組語層級的行為,本身就不具備可移植性。
02/13 22:38, 25F

02/13 22:43, 2周前 , 26F
行為一樣,不代表語意完整、正確
02/13 22:43, 26F

02/13 22:43, 2周前 , 27F
詳情可以搜尋undefined behavior,這是為了避免這一
02/13 22:43, 27F

02/13 22:43, 2周前 , 28F
類事情發生。
02/13 22:43, 28F

02/14 10:18, 2周前 , 29F
你用C++的std::atomic g++和clang++會去call額外的API啦
02/14 10:18, 29F

02/14 10:18, 2周前 , 30F
用gcc的build-in __atomic_store()/__atomic_load()才能直
02/14 10:18, 30F

02/14 10:19, 2周前 , 31F
接看到assembly的差異
02/14 10:19, 31F

03/04 00:54, 1天前 , 32F

03/04 00:55, 1天前 , 33F
03/04 00:55, 33F

03/04 00:56, 1天前 , 34F
.. The value of sizeof(bool) is implementation defined .,
03/04 00:56, 34F
文章代碼(AID): #1fZ7vDfQ (C_and_CPP)
文章代碼(AID): #1fZ7vDfQ (C_and_CPP)