看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《wtchen (沒有存在感的人)》之銘言: : 這篇有爭議,乾脆直接重寫,看大家認為如何 : (尤其希望C++的高手能補充或指正,特別是multithreading的部份) : ============================================================== : 08. ++i/i++ 和 --i/i-- 的結果跟你怎麼用有關 : ++i/i++ 和--i/i-- 的問題幾乎每個月都會出現,所以特別強調。 抱歉,覺得用推文空間有點窄,乾脆回文比較 free multithread 的狀況也是蠻多的,雖然我程式沒有你們那麼厲害 不過基本上如果兩個 thread 同時執行到這行: ++i,他的結果就像 你們講的無法預期 multihread 有可能跑在只有一個 core cpu 的狀況下,這時候兩個 thread 跑 ++i 最後就真的是 i+=2,如果是單 core 但卻 enable hyperthread 的話,這部分我有點點忘了,不過印象中依然會是 i+=2,因為物理上還是單核,這部分可以給了解詳情的人補充, hyperthread 我不會,講的不一定對 不過現在都是多核啦,所以結果是無法預期的,會講到多核跟單核 的原因是在不同的機器上確實有機會碰到一台老是會有 race conditon 另外一台老舊的機器卻沒有問題的狀況 c++ 的最新 atomic 運算表達方式標準我不確定長得如何,因為印象 中這部分在過去一直有進步,不過應該 google 是找得到才對,再來跟 使用的 compiler 以及版本也有關係,使用前需要詳閱公開說明書 anyway,如果一個變數 i 被宣告成 static 或者什麼樣的形式,使得 變數 i 有可能會讓兩個以上的 thread concurrent 去 access 時, 用 ++ 或者 -- 是不穩當的,要嘛就是 lock,要嘛就必須確定是 atomic operation 以上是個人的經驗,我不是很謹慎的人所以懶得再去翻找資料比對,所以 我相信會有高手出來指正或者補充的更多,能拋磚引玉我覺得也不錯。只 是剛好看到版主講到 multithread 就手癢癢獻醜 只不過我覺得單純 c/c++ 的討論就夠啦,又要再引進 multi-thread 的話 我覺得議題有點點大,因為這又可以再牽扯的更多更多,版主以及我看另外 一位網友講的東西就已經很 detail 也很專業,在更擴及下去個人是覺得有 些些 over,拙見拙文參考看看,如果有說錯先 say sorry,很怕被冠上誤人 子弟的罪。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.110.41 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1465483724.A.84A.html ※ 編輯: cgcheng (223.136.110.41), 06/09/2016 22:53:56
Caesar08: 討論這部分的時候不會討論到multi thread,因為multi th 06/09 22:58
Caesar08: read本來就要自己sync 06/09 22:58
wtchen: 因為C++Standard有multithread的東西,想請問Standard 06/09 23:03
wtchen: 對這方面到底是如何規定的? 06/09 23:03
cgcheng: 因為版主問了,所以我特地稍微查了一下c++11關於多線程 06/09 23:23
cgcheng: 看起來是把對多線程的支援度提高,實際使用上仍然需要觀 06/09 23:24
cgcheng: 念 06/09 23:26
wtchen: 感謝,因為我大部份都用C所以C++比較不熟 06/09 23:27
wtchen: 既然不會影響我就放心了 06/09 23:28
cgcheng: 不過我剛重看了一下討論串,caesar08你有參與討論? 06/09 23:28
cgcheng: wtchen看得出你很仔細謹慎,我個人是頗欣賞,我所講的只 06/09 23:31
cgcheng: 是提醒加上手賤,never mind 06/09 23:32
wtchen: 給新手看的東西要很小心,不要造成太大的誤解讓新手一開始 06/09 23:34
wtchen: 觀念錯誤,所以謹慎為上。 06/09 23:34
cgcheng: 嘖嘖,所以一開始我其實不是很想發文,因為要很謹慎 06/09 23:35
wtchen: 討論的時候無所謂啦,板工發的置底文就另當別論了 XD 06/09 23:36
Caesar08: no。我只是要說,不需要考慮到multi thread的情況 06/09 23:36
cgcheng: 不過那個什麼逗號是分隔號還是運算元這個新人應該看不懂 06/09 23:36
cgcheng: caesar08,y..我講同件事...但總覺得感覺哪邊怪怪的 06/09 23:38
wtchen: ,運算符那邊要是沒人提我也不知道 XD 06/09 23:45
wtchen: 不過,分隔號不算sequence point應該是必備常識 06/09 23:46
cgcheng: 常識?!其實在很久前我並不知道.後來就算知道了但還真的沒 06/09 23:48
cgcheng: 遇到讓我有機會去管這個差別的時刻 06/09 23:49
cgcheng: 好比有一條好像是說不要overload逗號,實際上就是不會有 06/09 23:52
cgcheng: 人這樣搞 06/09 23:52
wtchen: 例如F(a(&x), b(&x)),如果a跟b都會改變該引數指標指向 06/09 23:52
wtchen: 的變數(x),那結果就會看a先執行還是b先執行 06/09 23:53
wtchen: 當然會這樣搞的應該很少.... 06/09 23:54
cgcheng: oh,boost好像有這樣幹,那那那當我沒常識好了 06/09 23:54
cgcheng: func裡面再有func,好像也是,勾起我一點點回憶..不過很少 06/09 23:56
cgcheng: 倒是真的 06/09 23:56
wtchen: 因為C有aliasing,如果觀念不太對寫出的code會很奇怪 06/09 23:58
cgcheng: alias是啥 06/09 23:59
wtchen: 雖然可以strict aliasing,可是有些高手也會用aliasing 06/10 00:00
wtchen: 做些有的沒的特技。 06/10 00:00
Frozenmouse: 原本非題所涵蓋的範圍比現在的廣很多,改這樣感覺變 06/10 00:08
Frozenmouse: 成是只針對 ++ -- 而已了… 06/10 00:08
Frozenmouse: 原本非題→原本題目 06/10 00:08
Hazukashiine: 其實我原本想到比較好的題目是: 06/10 00:12
Hazukashiine: 不要在兩個順序點之間,對同一個變數賦值 06/10 00:12
cgcheng: wtchen謝謝,我看了一下覺得好像開-Wall就有機會避免 06/10 00:13
cgcheng: Hazukashiine的題目不錯 06/10 00:14
Hazukashiine: 嗚嗚被切掉了QQ ...,對同一個變數賦值兩次以上 06/10 00:16
Hazukashiine: 但是我覺得啊~越精確的解釋,新手真的越容易理解嗎 06/10 00:17
cgcheng: 當然不會理解 06/10 00:18
Hazukashiine: 只是要避免寫出一些奇怪代碼而要去理解順序點是什麼 06/10 00:19
cgcheng: 只會讓他更亂而已 :) 06/10 00:19
cgcheng: 其實我反而好奇你不跟新人講,他就真的會寫出奇怪的東西? 06/10 00:20
cgcheng: 忘了問,wtchen所說的alias是指point來point去嗎? 06/10 00:23
Hazukashiine: 也許會。因為我就做過這種事,在我是新手的時候 www 06/10 00:24
cgcheng: 回文還挺累的,小弟要先告退了..也許不會再回來看這串 06/10 00:24
Frozenmouse: 第一次學++ --興奮到寫出奇怪的東西也是有可能的XD 06/10 00:26
cgcheng: Hazukashiine,really?看來要學好程式真的很難 06/10 00:26
Frozenmouse: 更不用說會有教授教這個… 06/10 00:27
cgcheng: 不才小弟第一個學lang的叫做quick basic QQ 06/10 00:28
cgcheng: 我不是資工的,不過一般計算機概論我肯定教授不會教這個XD 06/10 00:29
wtchen: Hazukashiine的題目我也想過,可是要跟新手解釋順序點 06/10 00:29
wtchen: 好困難阿....而且++/--算是月經題了 06/10 00:30
Hazukashiine: 對啊,想到就覺得會適得其反 XDDD 06/10 00:30
wtchen: alaising就是一個函式兩個以上pointer參數是同一個這樣... 06/10 00:31
Hazukashiine: 所以我就想說用 在一個無順序點的表示式中... 06/10 00:31
wtchen: 一般人不會這樣搞不過compiler預設就是假設真的有人這樣寫 06/10 00:31
Hazukashiine: 一是邏輯等價的,二是也許看的人會直接無視順序點XD 06/10 00:32
cgcheng: parameter同個pointer?有需要這樣子用阿? 06/10 00:32
wtchen: 現在大學到底教不教順序點?如果有教的話怎麼老是有++/-- 06/10 00:32
wtchen: 的問題出現? 06/10 00:33
Hazukashiine: 不教,因為這是實作的細節,不是程式語言理論基礎 06/10 00:33
Hazukashiine: 遇到的人,自己想辦法除錯啦,自己就會發現了吧應該 06/10 00:34
wtchen: cgcheng大不看這串OK,要回來看文發文就好.... 06/10 00:34
cgcheng: 我怎麼覺得可以解讀為++/--學好就是一個破處的成長開始XD 06/10 00:35
Hazukashiine: 老師也會儘可能不出那種自己為是要背優先級的爛題目 06/10 00:35
Hazukashiine: 以 06/10 00:35
wtchen: 不過因為C++的作法跟C又有不同,所以原題目不太合適 06/10 00:36
wtchen: C++可以允許 ++++i這種寫法 06/10 00:37
wtchen: 有人有更好的意見歡迎提出,集思廣益! 06/10 00:37
Hazukashiine: 不然就擴展題目的範圍:不要做出語言未定義的性為? 06/10 00:38
cgcheng: ++++i因為可能還要考慮operator overload吧? 06/10 00:38
Hazukashiine:                      行 06/10 00:38
Hazukashiine: ++i 在 C++ 是 lvalue 而 C 是 rvalue 06/10 00:39
cgcheng: 你們討論的本來就到了實作上的細節,不過實際上到底要不要 06/10 00:39
cgcheng: 管這些都還很難說 06/10 00:40
wtchen: 不要做出語言未定義的行為->未定義行為多到數不清~~ 06/10 00:41
Hazukashiine: 對啊 XDDD 沒錯啊 但是可以舉幾個常見會犯的例子 06/10 00:41
cgcheng: 我這個新手只會覺得哪來這麼多毛 :~~ 06/10 00:42
wtchen: 所以我盡可能舉例說明....但是C跟C++分歧已經越來越大 06/10 00:42
Hazukashiine: 不過這會讓它與前面的東西重疊,修改字串常量就是UB 06/10 00:43
wtchen: 要兼顧其實有點複雜,加上很多老師把C++當C教 06/10 00:43
cgcheng: 好吧,到這很明顯crazy,只是路過,很謝謝你們陪我 XD 06/10 00:43
wtchen: C++都快出到17了還在用C的語法... 06/10 00:44
Hazukashiine: 不然就分成新手與進階兩種不同的內容(誤 06/10 00:45
wtchen: 所以我才想說針對++/--就好,就如cgcheng說的,搞懂 06/10 00:45
wtchen: 就很不容易了 06/10 00:45
wtchen: 標題改了一下 06/10 15:28
wtchen: "++i/i++/--i/i--/f(&i)哪個先執行跟順序有關" 06/10 15:28
wtchen: 不知這樣好不好?原標題因為真的不太正確所以不能用 06/10 15:29
Hazukashiine: 沒有說不好,但是實在這樣下去越來越複雜也是不妥QQ 06/10 16:33
wtchen: 我是覺得正確最重要,已經儘可能簡化了 06/10 16:50
※ 編輯: cgcheng (223.136.110.41), 06/11/2016 03:26:36
locklose: 朝聖推 06/29 16:01