亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

cout同步/線程安全嗎?

cout同步/線程安全嗎?

C++
手掌心 2019-06-26 17:11:41
cout同步/線程安全嗎?一般來說,我假設流不是同步的,應該由用戶來執行適當的鎖定。然而,做這樣的事情cout在標準圖書館得到特殊待遇?也就是說,如果多個線程正在寫入cout他們能把cout反對?我知道,即使同步,您仍然會得到隨機交錯的輸出,但這種交織是有保證的。也就是說,使用起來安全嗎?cout從多個線程?這個供應商依賴嗎?GCC是做什么的?重要:如果你說“是”,請提供一些參考,因為我需要一些證據。我還擔心的不是底層的系統調用,它們很好,但是流在頂部添加了一層緩沖。
查看完整描述

3 回答

?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

這是個很好的問題。

首先,C+98/C+03沒有“線程”的概念。所以在這個世界上,這個問題是毫無意義的。

那C+0x呢?看見Martinho的回答(我承認這讓我很驚訝)。

具體的實現前C+0x怎么樣?例如,下面是basic_streambuf<...>:sputcGCC 4.5.2(“流線型”頭球):

 int_type
 sputc(char_type __c)
 {
   int_type __ret;
   if (__builtin_expect(this->pptr() < this->epptr(), true)) {
       *this->pptr() = __c;
        this->pbump(1);
        __ret = traits_type::to_int_type(__c);
      }
    else
        __ret = this->overflow(traits_type::to_int_type(__c));
    return __ret;
 }

顯然,這不執行鎖定。也沒有xsputn..這絕對是cout使用的流的類型。

據我所知,libstdc+不對任何流操作執行鎖定。我不希望有,因為那會很慢。

因此,使用此實現,兩個線程的輸出顯然有可能相互損壞(只是交錯)。

這個代碼會破壞數據結構本身嗎?答案取決于這些函數的可能交互;例如,如果一個線程試圖刷新緩沖區,而另一個線程試圖調用xsputn或者別的什么。這可能取決于編譯器和CPU如何決定重新排序內存負載和存儲;需要仔細分析才能確定。如果兩個線程試圖并發地修改同一個位置,則還取決于CPU所做的工作。

換句話說,即使它在當前環境中正常工作,當您更新任何運行時、編譯器或CPU時,它也可能中斷。

執行摘要:“我不會”。構建一個日志類來執行正確的鎖定,或者移動到C+0x。

作為一個弱的替代方案,您可以將cout設置為未緩沖??赡軙^與緩沖區和調用相關的所有邏輯(盡管沒有保證)。write直接。盡管這可能會令人望而卻步。


查看完整回答
反對 回復 2019-06-26
  • 3 回答
  • 0 關注
  • 726 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號