成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++多線程調(diào)試和測(cè)試的注意事項(xiàng)

開發(fā) 后端
本文介紹的是關(guān)于C++多線程調(diào)試和測(cè)試的一些注意事項(xiàng),在我看來(lái)多線程一直都是很難理解的知識(shí),希望對(duì)你大家有幫助吧!

在一個(gè)程序中,這些獨(dú)立運(yùn)行的程序片斷叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理”。利用線程,用戶可按下一個(gè)按鈕,然后程序會(huì)立即作出響應(yīng),而不是讓用戶等待程序完成了當(dāng)前任務(wù)以后才開始響應(yīng)。

在上次的帖子聊了C++多線程的跨平臺(tái)問(wèn)題,后來(lái)感覺意猶未盡。今天順便說(shuō)一下開發(fā)C++多線程應(yīng)用程序時(shí),有關(guān)調(diào)試和測(cè)試的一些注意事項(xiàng)。下面這些注意事項(xiàng)主要是針對(duì)C++,不過(guò)有些對(duì)于其它的語(yǔ)言也適用。

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

很多同學(xué)非常依賴于調(diào)試器的斷點(diǎn)功能和單步功能。這在單線程情況下倒還好(不過(guò)有些單線程但涉及GUI的程序,也會(huì)有點(diǎn)麻煩)。至于多線程程序的調(diào)試,這兩種手段簡(jiǎn)直就是噩夢(mèng)的開始。多線程造成的主要問(wèn)題大都和競(jìng)態(tài)條件(Race Condition,詳細(xì)解釋看“這里 ”)有關(guān)。

而設(shè)置斷點(diǎn)或單步跟蹤可能會(huì)嚴(yán)重干擾 多線程之間的競(jìng)爭(zhēng)狀態(tài)。導(dǎo)致你看到的是一個(gè)假象。比如本來(lái)有兩個(gè)線程并發(fā)執(zhí)行,存在某些不和諧的Bug(由競(jìng)態(tài)引起)。一旦你在某一個(gè)線程設(shè)置了斷點(diǎn),該線程在斷點(diǎn)處停住了,只剩下另一個(gè)線程在跑。這時(shí)候,并發(fā)的場(chǎng)景已經(jīng)完全被破壞了,你通過(guò)調(diào)試器看到的可能 是一個(gè)和諧的場(chǎng)景。

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

二、關(guān)于Log輸出

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

1、傳統(tǒng)Log機(jī)制的問(wèn)題

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

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

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

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

3、Log的副作用

不過(guò)捏,即使log函數(shù)再短小精悍,也還是有可能影響競(jìng)態(tài)條件(畢竟log也有開銷,也要消耗CPU時(shí)間)。

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

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

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

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

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

1、放棄使用Debug版本

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

2、兩種版本同步測(cè)試

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

四、關(guān)于測(cè)試的機(jī)器(硬件)

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

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

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

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

原文地址:http://blog.csdn.net/program_think/archive/2009/04/10/4061801.aspx

【編輯推薦】

  1. C/C++是程序員必須掌握的語(yǔ)言嗎?
  2. C++和Java 的缺省初始化問(wèn)題
  3. 淺談怎樣加快C++代碼的編譯速度
  4. C/C++中動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建和調(diào)用
  5. 使用托管C++粘合C#和C++代碼(一)
責(zé)任編輯:于鐵 來(lái)源: CSDN博客
相關(guān)推薦

2010-01-18 16:12:16

CC++語(yǔ)言

2010-01-14 18:19:40

C++語(yǔ)言

2010-01-25 18:12:28

C++

2011-08-01 12:53:25

iPhone 多線程 線程

2010-01-20 17:58:54

C++靜態(tài)成員

2010-01-26 16:54:58

學(xué)習(xí)C++

2010-01-27 09:12:01

C++語(yǔ)言學(xué)習(xí)

2010-02-03 16:42:45

C++變量作用域

2010-02-05 15:30:54

C++多線程測(cè)試

2011-07-21 15:20:31

iPhone SDK 多線程

2010-01-26 16:47:47

VC++6.0

2025-04-03 07:33:56

2020-05-15 15:38:54

綜合布線5G網(wǎng)絡(luò)

2010-06-21 14:39:56

光纖測(cè)試

2009-09-01 17:25:33

初學(xué)C#編程

2010-07-12 10:03:25

SQL Serverr

2010-01-18 14:25:19

使用C++Builde

2011-05-26 11:22:04

SEO

2009-06-25 14:41:06

JavaBean

2009-06-11 17:52:08

JavaBean
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产激情免费视频 | 国产精品久久久亚洲 | 久久久久亚洲 | 亚洲成人综合社区 | 成人免费看片网 | av国产精品毛片一区二区小说 | 日韩视频一区在线观看 | 91免费版在线 | 欧美aⅴ | 欧美1区| 91社区在线观看播放 | 国产精品免费在线 | 久久国产区 | 不卡av电影在线播放 | 中文字幕国产精品 | 国产伦精品一区二区三区视频金莲 | 操操日 | 日韩中文在线视频 | 一区二区三区四区av | 视频三区| 91资源在线 | av片免费观看 | 91麻豆精品国产91久久久资源速度 | 99精品国产在热久久 | 一级做a爰片性色毛片 | 夜夜爽99久久国产综合精品女不卡 | 超碰3| 2018天天干天天操 | 欧洲精品视频一区 | 蜜桃视频在线观看免费视频网站www | 欧美精品综合在线 | 欧美在线视频a | 午夜久久久久 | 精品国产精品三级精品av网址 | 日韩一区二区三区视频 | 成人精品一区二区三区 | 色婷婷国产精品综合在线观看 | 久久99久久| www.youjizz.com日韩 | 日韩一区中文字幕 | 欧美精品一区二区三区在线 |