這幾天用多執行緒

2021-05-22 21:17:02 字數 958 閱讀 9307

系統正式開發有大半個月了,由於有非常多的loader需要同時執行,所以選擇多執行緒來實現。伺服程序m首先建立若干個s程序;如果有服務請求到達,m建立服務執行緒e。e和s之間用fifo用以傳遞資料。當有資料到達之後,e通過fifo傳給s,s啟動乙個執行緒loader(loader和s之間也是fifo)。由於mysql的loader命令如果成功執行的話是一直阻塞的,只有出錯的時候才立即返回,所以s主線程和loader執行緒很不好同步。所以我已開始使用block模式操作s與loader之間的fifo出現了問題。當loader應為mysql的表沒有建立好的時候立即出錯返回,之後s才以預設block的方式開啟fifo,導致s一直阻塞在open操作上;s一阻塞,導致同樣是以預設方式開啟fifo的e執行緒也被阻塞;e一阻塞,伺服器端沒有人去服務socket,導致客戶端也被阻塞在send上面。 唉,真是慘啦!

當初我也是意識到阻塞模式讀可能會有問題,所以特別小心的處理各個執行緒的啟動問題,沒有想到還是陰溝裡面翻船了。不喜歡非阻塞模式是因為不喜歡去一遍遍的處理eagain錯誤。

嘗試了一種解決方案:1. 以o_wtonly和o_nonblock模式開啟fifo,這是如果讀端沒有準備好,會返回錯誤--沒有此裝置,忽略掉此錯誤,並檢查是否loader執行緒是否已經退出。成功開啟之後呼叫ioctl設定寫模式,但是檢視ioctl的man頁後發現不支援設定nonblock,只好作罷;2. open的方式不變,write也是以非阻塞模式寫,但是讀端仍然採用阻塞模式。

粗略的試了一下2,沒有問題,明天還得用ut測試一下才行。

1)執行緒不存在繼承關係,所以他退出的時候建立者並不能獲得通知,其他的執行緒可以用join方法取得其退出狀態。如果沒有被join,那麼他的狀態猶如zombie程序;但是執行緒可以被設定為deattached,這樣它退出的時候就會釋放資源;

2)condition的signal方法存在丟失的問題:如果signal的時候沒有執行緒處在wait狀態,那麼signal不起作用;

3)non_block模式讀fifo的時候行為?

這幾天用linux的體驗

買了張16gb的u盤。每天就不厭其煩的拼命往上面裝各種發行版的linux作業系統的live版本。先用unetbootin把映象寫進去以後,再開機去開啟那個live版的系統,再把它裝在硬碟上面 硬碟已經被我清空了一部分的 第乙個發行版是backtrack5 r2 gnome,這是我用的最久也是最舒服的...

回家這幾天

1.硬碟錄影機聯網 沒有無線上網功能,其實我在想能不能通過編譯無線驅動,從系統的層面來解決,這樣是最省資金的 剛好手上有raspi 所以計畫是樹莓派無線網絡卡上網然後共享網路到lan,貼吧有一篇文章,一開始是可以的,但後來就一直失敗,也不知道為何。網上關於這個的教程少,加之網路方面,閘道器啥的不太熟...

過年這幾天

這幾天在家過年,一點不想搞科研。就想著徹底放縱下,然後到學校裡有足夠的勁頭投入到學習上。放假前的那幾天學習效率太低了,畢竟忙了一學期,是時候換換腦子了。今天無意中開啟了jors的 發現 的一審已經結束了,正在等編輯處理意見。心中非常忐忑,自己又開啟 看了一遍,猜猜審稿人可能會提出什麼意見。那個證明部...