91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++多線程調試和測試的注意事項有哪些

發布時間:2021-11-30 15:55:47 來源:億速云 閱讀:160 作者:iii 欄目:編程語言

這篇文章主要講解了“C++多線程調試和測試的注意事項有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++多線程調試和測試的注意事項有哪些”吧!

一、關于設置斷點和單步執行

很多同學非常依賴于調試器的斷點功能和單步功能。這在單線程情況下倒還好(不過有些單線程但涉及GUI的程序,也會有點麻煩)。至于多線程程序的調試,這兩種手段簡直就是噩夢的開始。多線程造成的主要問題大都和競態條件(Race Condition,詳細解釋看“這里 ”)有關。

而設置斷點或單步跟蹤可能會嚴重干擾 多線程之間的競爭狀態。導致你看到的是一個假象。比如本來有兩個線程并發執行,存在某些不和諧的Bug(由競態引起)。一旦你在某一個線程設置了斷點,該線程在斷點處停住了,只剩下另一個線程在跑。這時候,并發的場景已經完全被破壞了,你通過調試器看到的可能 是一個和諧的場景。

稍微跑一下題。這很類似量子力學的“測不準原理”,觀測者的觀測行為干擾了被測量的客體,導致觀測者看到的是一個干擾后的現象。

二、關于Log輸出

既然斷點和單步不好用。那咋辦捏?一個替代方案是輸出log日志。它可以有效減輕斷點和單步所導致的(針對競態條件的)副作用。

1、傳統Log機制的問題

傳統的log輸出主要是打印到屏幕或者輸出到文件。對于C++而言,標準庫內置的類和函數(比如cout、printf、fputs)可能會有線程安全的問題(和編譯器的具體實現有關)。尤其是標準流類庫(iostream)的八個全局對象,更是要小心慎用。輕則輸出的log文本混雜,重則導致程序崩潰。

鑒于上述原因,應該盡量使用第三方線程庫內置的log機制來搞定log輸出功能。比如ACE內置的ACE_Log_Msg等。

2、Log函數要短小精悍

很多情況下,我們會包裝一個公用的函數來實現log輸出功能。然后在該函數內部調用線程庫的log類/函數。為了不影響線程的競態條件,這個log函數要盡可能簡單輕便:不要涉及太多雜七雜八的瑣事、千萬別進行耗時的操作、盡量不操作一些全局的變量。

3、Log的副作用

不過捏,即使log函數再短小精悍,也還是有可能影響競態條件(畢竟log也有開銷,也要消耗CPU時間)。

萬一競態條件受到log的影響,那就比較棘手了。我以前就碰到過這種情況:加了log,程序沒有問題;去掉log,程序隨機崩潰。這種情況一般有兩種可能:要么是log功能本身有問題,要么是程序的競態條件非常敏感(連log的開銷都會有影響)。

這時候你能依靠的就只有肉眼和人腦了。先把相關的代碼和文檔仔細看上幾遍(***再找其他有經驗的人一起Code Review),然后大家一起開動腦筋使勁琢磨。

三、關于Debug版本和Release版本

C++程序經常有Debug版本和Release版本的區別。有些時候,這也會導致一些多線程的問題。

由于Debug版本包含了一些調試信息、啟用了某些調試機制(比如assert宏)。所以就可能 影響到多線程的競爭狀態。在倒霉的時候,會碰上Debug版本工作正常,Release版本程序隨機崩潰。要避免這種情況,可以考慮下面兩個辦法:

1、放棄使用Debug版本

你可以干脆放棄使用Debug版本。在這種情況下,你需要考慮把諸如assert之類調試相關的宏替換成自己的一套宏,使得在非Debug版本下也可以生效。

2、兩種版本同步測試

使用此方法,程序員平時自測可以使用Debug版本,但是測試人員日常測試的必須是Release版本。具體的操作步驟可以利用每日構建來輔助進行(每日構建的介紹參見“這里 ”)。一定要避免:在平時僅僅搞Debug版本的測試,等到發布前夕再制作Release版本。這種做法是非常危險的!

四、關于測試的機器(硬件)

說一個親身經歷、印象深刻的事情。

當年用ACE開發跨平臺程序的時候,公司內的的開發環境和測試環境都是單CPU的機器。因為當時多核的機器還沒有面世,多CPU的機器又挺貴,公司沒舍得花錢配置。

軟件開發完之后,測試人員經過幾輪回歸測試,也沒發現太大問題。但是拿到客戶的環境中運行,卻經常會隨機性崩潰。因為不能在客戶環境中Debug,自己的環境又死活沒問題,開發組的幾個人只好充分發揮肉眼和人腦的功能(盯著代碼和設計文檔猛想)。經過N長時間,差點把腦袋想破,***才意識到客戶的機器是多CPU的。然后趕緊從其它部門借了一臺多CPU機器,裝上軟件調試,***查出是一個第三方庫有問題。此事過后,我立即想出各種法子,去申請了幾臺多CPU機器給測試人員用。

由于上述的前車之鑒,所以我強烈建議:如果是開發多線程的應用程序,盡量給每一個 編程人員和測試人員都配置多核/多CPU的機器。畢竟現在多核機器已經很普及了,即使多CPU的機器,價格也還湊合。實在沒必要為了省那點小錢而引入開發風險(不光會浪費開發/測試人員的時間,還可能增加實施和維護的成本)。

感謝各位的閱讀,以上就是“C++多線程調試和測試的注意事項有哪些”的內容了,經過本文的學習后,相信大家對C++多線程調試和測試的注意事項有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

马公市| 山东| 镇康县| 措勤县| 永新县| 浪卡子县| 屯门区| 平乡县| 黑山县| 苍山县| 宣城市| 吴桥县| 南丹县| 八宿县| 德兴市| 阿合奇县| 堆龙德庆县| 博爱县| 满城县| 新安县| 桓仁| 遂溪县| 犍为县| 台湾省| 海安县| 永顺县| 定日县| 离岛区| 紫阳县| 措勤县| 新兴县| 黔江区| 桃源县| 凤冈县| 五华县| 沅陵县| 内黄县| 家居| 庆阳市| 京山县| 宣化县|