作者hn12404988 (Willy)
看板C_and_CPP
標題[問題] cout影響socket的send()??
時間Wed Oct 12 17:12:51 2016
開發平台(Platform): CentOS 7
編譯器: GCC std=c++11
額外使用到的函數庫(Library Used):
sys/socket.h
poll.h
問題(Question):
很奇怪的狀況,一段程式碼中,會先send(),成功後會poll()來等
poll成功的話就recv()
很基本的使用,但只要我在send之前簡單加上一行:
std::cout << "a" << std::endl;
(printf也一樣)
就有可能「機率性」的,server就收不到send,也可說就是send不出去
但如果是在send之後,不管加上幾行cout,都是正常
在想是不是底層的i/o有bug? 另外這是multi-thread的程式
這段程式是運行在子thread,但也看不出來cout跟multi-thread有甚麼關係?
請問有人遇過這種狀況嗎?
或認為可能的問題是出在哪嗎?
------------------編輯-------------------------
剛剛就找到問題點了,有點蠢
因為我這個程式是一個on production時要24小時跑的
是這樣設計的,但因為我現在再加新功能測試
我讓他跑下去,就馬上關掉看結果(int main主thread就死了)
子thread這時取不到需要的資料(因為部份變數宣告在外面)
子thread是一個[&]的lambda,所以是call by reference
導致,沒加一行cout,子thread可以搶在母thread關閉前拿到資料
加上去,那微小的毫秒差,會讓子thread拿到一片空白
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.133.16.181
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1476263573.A.37D.html
1F:→ firejox: 機率性..應該是同步的問題 10/12 17:25
※ 編輯: hn12404988 (220.133.16.181), 10/12/2016 17:39:00
2F:→ Schottky: 咦,跑 daemon 沒有讓它自行 detach 嗎? 10/12 17:42
3F:→ Schottky: 有時候這類問題真的超難抓... 10/12 17:48
4F:→ hn12404988: 哈,說來蠢,子thread設計執行完就回收,我剛在測試如 10/12 17:49
5F:→ hn12404988: 果使用者忘記回收,會發生甚麼事,但一時間沉迷於 10/12 17:49
6F:→ hn12404988: cout怎麼會send這個狀況 10/12 17:50