這是個(gè)很好的問(wèn)題。
首先,C+98/C+03沒(méi)有“線(xiàn)程”的概念。所以在這個(gè)世界上,這個(gè)問(wèn)題是毫無(wú)意義的。
那C+0x呢?看見(jiàn)Martinho的回答(我承認(rèn)這讓我很驚訝)。
具體的實(shí)現(xiàn)前C+0x怎么樣?例如,下面是basic_streambuf<...>:sputc
GCC 4.5.2(“流線(xiàn)型”頭球):
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;
}
顯然,這不執(zhí)行鎖定。也沒(méi)有xsputn
..這絕對(duì)是cout使用的流的類(lèi)型。
據(jù)我所知,libstdc+不對(duì)任何流操作執(zhí)行鎖定。我不希望有,因?yàn)槟菚?huì)很慢。
因此,使用此實(shí)現(xiàn),兩個(gè)線(xiàn)程的輸出顯然有可能相互損壞(不只是交錯(cuò))。
這個(gè)代碼會(huì)破壞數(shù)據(jù)結(jié)構(gòu)本身嗎?答案取決于這些函數(shù)的可能交互;例如,如果一個(gè)線(xiàn)程試圖刷新緩沖區(qū),而另一個(gè)線(xiàn)程試圖調(diào)用xsputn
或者別的什么。這可能取決于編譯器和CPU如何決定重新排序內(nèi)存負(fù)載和存儲(chǔ);需要仔細(xì)分析才能確定。如果兩個(gè)線(xiàn)程試圖并發(fā)地修改同一個(gè)位置,則還取決于CPU所做的工作。
換句話(huà)說(shuō),即使它在當(dāng)前環(huán)境中正常工作,當(dāng)您更新任何運(yùn)行時(shí)、編譯器或CPU時(shí),它也可能中斷。
執(zhí)行摘要:“我不會(huì)”。構(gòu)建一個(gè)日志類(lèi)來(lái)執(zhí)行正確的鎖定,或者移動(dòng)到C+0x。
作為一個(gè)弱的替代方案,您可以將cout設(shè)置為未緩沖??赡軙?huì)跳過(guò)與緩沖區(qū)和調(diào)用相關(guān)的所有邏輯(盡管沒(méi)有保證)。write
直接。盡管這可能會(huì)令人望而卻步。