C++多線程測試要點有哪些

這篇文章主要介紹“C++多線程測試要點有哪些”,在日常操作中,相信很多人在C++多線程測試要點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++多線程測試要點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

我們提供的服務(wù)有:網(wǎng)站設(shè)計制作、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、二七ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的二七網(wǎng)站制作公司

★關(guān)于設(shè)置斷點和單步執(zhí)行

很多同學(xué)非常依賴于調(diào)試器的斷點功能和單步功能。這在單線程情況下倒還好(不過有些單線程但涉及GUI的程序,也會有點麻煩)。至于多線程程序的調(diào)試,這兩種手段簡直就是噩夢的開始。多線程造成的主要問題大都和競態(tài)條件(Race Condition,詳細解釋看“這里”)有關(guān)。而設(shè)置斷點或單步跟蹤可能會嚴(yán)重干擾多線程之間的競爭狀態(tài)。導(dǎo)致你看到的是一個假象。比如本來有兩個線程并發(fā)執(zhí)行,存在某些不和諧的Bug(由競態(tài)引起)。一旦你在某一個線程設(shè)置了斷點,該線程在斷點處停住了,只剩下另一個線程在跑。這時候,并發(fā)的場景已經(jīng)完全被破壞了,你通過調(diào)試器看到的可能是一個和諧的場景。

稍微跑一下題。這很類似量子力學(xué)的“測不準(zhǔn)原理”,觀測者的觀測行為干擾了被測量的客體,導(dǎo)致觀測者看到的是一個干擾后的現(xiàn)象。

★關(guān)于Log輸出

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

◇傳統(tǒng)Log機制的問題

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

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

◇Log函數(shù)要短小精悍

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

◇Log的副作用

不過捏,即使log函數(shù)再短小精悍,也還是有可能影響競態(tài)條件(畢竟log也有開銷,也要消耗CPU時間)。
萬一競態(tài)條件受到log的影響,那就比較棘手了。我以前就碰到過這種情況:加了log,程序沒有問題;去掉log,程序隨機崩潰。這種情況一般有兩種可能:要么是log功能本身有問題,要么是程序的競態(tài)條件非常敏感(連log的開銷都會有影響)。

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

★關(guān)于Debug版本和Release版本

C++程序經(jīng)常有Debug版本和Release版本的區(qū)別。有些時候,這也會導(dǎo)致一些多線程的問題。

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

◇放棄使用Debug版本

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

◇兩種版本同步的C++多線程測試

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

★關(guān)于C++多線程測試的機器(硬件)

說一個親身經(jīng)歷、印象深刻的事情。

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

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

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

到此,關(guān)于“C++多線程測試要點有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

名稱欄目:C++多線程測試要點有哪些
當(dāng)前鏈接:http://muchs.cn/article16/jchddg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、網(wǎng)站策劃、電子商務(wù)、服務(wù)器托管、自適應(yīng)網(wǎng)站Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司