★关于设置断点和单步执行
很多同学非常依赖于调试器的断点功能和单步功能。这在单线程情况下倒还好(不过有些单线程但涉及 GUI 的程序,也会有点麻烦)。至于多线程程序的调试,这两种手段简直就是噩梦的开始。
多线程造成的主要问题大都和竞态条件(Race Condition,详细解释看“这里”)有关。而设置断点或单步跟踪可能会【严重干扰】多个线程之间的竞争状态。导致你看到的是一个假象。比如本来有两个线程并发执行,存在某些不和谐的 Bug(由竞态引起)。一旦你在某一个线程设置了断点,该线程在断点处停住了,只剩下另一个线程在跑。这时候,并发的场景已经完全被破坏了,你通过调试器看到的【有可能】是一个和谐的场景。
稍微跑一下题。这很类似量子力学的“测不准原理”,观测者的观测行为干扰了被测量的客体,导致观测者看到的是一个干扰后的现象。
★关于 Log 输出
既然断点和单步不好用。那咋办捏?一个替代方案是输出 log 日志。它可以有效减轻断点和单步所导致的(针对竞态条件的)副作用。
◇传统 Log 机制的问题
传统的 log 输出主要是打印到屏幕或者输出到文件。对于 C++ 而言,标准库内置的类和函数(比如“cout、printf、fputs”)可能会有线程安全的问题(和编译器的具体实现有关)。尤其是标准流类库(iostream)的八个全局对象,更是要小心慎用。轻则输出的 log 文本混杂,重则导致程序崩溃。
鉴于上述原因,应该尽量使用第三方线程库内置的 log 机制来搞定 log 输出功能。比如 ACE 内置的 ACE_Log_Msg 等。
◇Log 函数要短小精悍
很多情况下,我们会包装一个公用的函数来实现 log 输出功能。然后在该函数内部调用线程库的 log 类/函数。为了不影响线程的竞态条件,这个 log 函数要尽可能简单轻便:不要涉及太多杂七杂八的琐事、千万别进行耗时的操作、尽量不操作一些全局的变量。
◇Log 的副作用
不过捏,即使 log 函数再短小精悍,也还是有可能影响竞态条件(毕竟 log 也有开销,也要消耗 CPU 时间)。
万一竞态条件受到 log 的影响,那就比较棘手了。俺以前就碰到过这种情况:加了 log,程序没有问题;去掉 log,程序随机崩溃。这种情况一般有两种可能:要么是 log 函数本身就有 bug,要么是程序的竞态条件非常敏感(连 log 的开销都会有影响)。
这时候你能依靠的就只有肉眼和人脑了。先把相关的代码和文档仔细看上几遍(最好再找其他有经验的人一起 Code Review),然后大家一起开动脑筋使劲琢磨。
★关于 Debug 版本和 Release 版本
C++ 程序经常有 Debug 版本和 Release 版本的区别。有些时候,这也会导致一些多线程的问题。
由于 Debug 版本包含了一些调试信息、启用了某些调试机制(比如 assert 宏)。所以就【可能】影响到多线程的竞争状态。在倒霉的时候,会碰上 Debug 版本工作正常,Release 版本程序随机崩溃。要避免这种情况,可以考虑下面两个办法:
◇放弃使用 Debug 版本
你可以干脆放弃使用 Debug 版本。在这种情况下,你需要考虑把诸如 assert 之类调试相关的宏替换成自己的一套宏,使得在非 Debug 版本下也可以生效。
◇两种版本同步测试
使用此方法,程序员平时自测可以使用 Debug 版本,但是测试人员日常测试的必须是 Release 版本。具体的操作步骤可以利用每日构建来辅助进行(每日构建的介绍参见“这里”)。一定要避免:在平时仅仅搞 Debug 版本的测试,等到发布前夕再制作 Release 版本。这种做法是非常危险滴!
★关于测试的机器(硬件)
说一个亲身经历、印象深刻的事情。
当年用 ACE 开发跨平台程序的时候,公司内的的开发环境和测试环境都是单 CPU 的机器——在那个年代,多核的机器还没有面世,而多 CPU 的机器又挺贵,公司没舍得花钱配置。
软件开发完之后,测试人员经过几轮回归测试,也没发现太大问题。但是拿到客户的环境中运行,却经常会随机性崩溃。因为无法在客户环境中 Debug,自己的环境又死活没问题,开发组的几个人只好充分发挥肉眼和人脑的功能(盯着代码和设计文档猛想)。经过 N 长时间,差点把脑袋想破,最后才意识到客户的机器是多 CPU 的。然后赶紧从其它部门借了一台多 CPU 机器,装上软件调试,最后查出是一个第三方库有问题。此事过后,俺立即想出各种法子,去申请了几台多 CPU 机器给测试人员用。
由于上述的前车之鉴,俺强烈建议:如果是开发多线程的应用程序,尽量给【每个】编程人员和测试人员都配置“多核”或者“多 CPU”的测试机。毕竟现在多核机器已经很普及了,即使多 CPU 的机器,价格也还凑合。实在没必要为了省那点小钱而引入开发风险(不光会浪费开发/测试人员的时间,还可能增加实施和维护的成本)。
写到这里,可能有同学会问“超线程的机器如何捏?”
关于“多 CPU、多核、超线程”这三者之间的差异,有兴趣的同学可以看“Intel 官网的介绍”。俺个人感觉超线程不如多核与多CPU爽。
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想和本文原始地址:
https://program-think.blogspot.com/2009/04/debug-test-multithreaded-applications.html
有人打算整理一下关于编程随想下落的线索吗?(从正反两个方面来举证)
好多怪事都是人为的,第一在搞邪术如祭鬼封神献祭打call,其次是搞种姓的事,
这帮东西用老外的名义来操控挑拨玩弄这个那个,这也是奇葩的,和叫东土人找阿三还是鬼子去表达册封封禅这皇帝是东土的皇帝一样奇葩, ......
ym蜀人都不愿放手的东西如屁眼套路,幼女,献祭,老单和最高神位是有原因的,很值得去研究的 ......
即使博主能活着出狱,若要看到他更新六四系列,那也是在天朝发生了民主化之后,共产党不再有能力镇压批评者之时。
就算哪天中国情报部门不经司法程序,直接把人暗杀了,我也不会觉得奇怪。
https://www.zaobao.com.sg/realtime/china/story20241226-5649612
https://www.youtube.com/watch?v=ozVq_04XMro
如果出现了自杀场景,多半是政府秘密下令处决,并伪装成了自杀。
来自Firsthack的评论
而且,二审的发改率(发回重审+改判)是一个考核政绩的指标,高层认为这个数字越低说明冤假错案越少,然后下面就越容易升官。 ......
原神UID:310221197410210025
互动热线: 13524626271 上海移动
学历: 硕士
生日: 19741021
身高: 165 ......
周欣身份证310105197106042383
户籍地址 :上海市闵行区吴中路429弄15号501室
同户人 :薛军,男,310106196903180414,1969年03月18日; ......
希望各大媒体都报道这几个名字:审判长周欣,审判员:凌莉、须梅华。
家属贝震颖推特号:Birds_b_r_32309
多谢分享“中药注射剂”等国产医疗行业的相关丑闻。
另外,关于疫情期间的乱象,俺整理了一篇:
《每周转载:白纸抗议年的“动态清零”灾难(网文14篇,多图)》
多年前不记得在哪篇博文的评论区和博主讨论叙利亚的命运,当时叙利亚的局势还未尘埃落定。可惜博主现在大牢内,看不到。
这次叙利亚的民主转型发生在俄国陷入战争的泥沼的背景下。 ......
这个是个邪术,第一个是给上面看(不知什么鬼),其次的就真的会指导目标去实际地去做这么些的犯罪邪恶,侵犯幼女的情节是经常频繁重复地出现地,和侵犯女性,还有就是生命 ......
估计到最高法院也没戏,可能会以9:0判决禁抖音。
欢迎提出不同观点。
你提到的是这二者之间的差异,俺也同意这些差异确实存在。
但是,俺要开始说但是了。从本文,咱们也可以讨论这二者之间的共性,至少包含以下方面: ......
玩邪术玩出个什么结果好歹给公开一下,拼命玩邪术还一声不吭,很危险的,要分享分享,劳资帮你们来研究研究
劳资相信这帮东西是能穿越时空的,现在是2019年的ZS,时空被改变穿越了。穿越时空的套路。这帮东西几千年都一个屌样,来几个十级地震都不会任何改变。 ......
现在的两党是争先比谁对华更强硬,已经通过的制裁法案不会松绑,已经加的关税也不会再降,否则就会被在野党骂成“通敌叛国”。
明年1月19日之前,抖音会被禁。
每天上网的好多人都在聊政治呢,难道你要把每一个聊政治的人都抓起来判刑?那也没用。因为年轻人越来越倾向于认为政治制度才是造成他们被困在他那个阶层的重要原因。 ......
这个博客对于政府的批评,大部分都是有理有据。你要是觉得哪里不对,可以反驳博主嘛。判7年是究竟有多心虚? ......
以色列做任何事,都是美国包容范围,和美国民意无关(甚至抗议都无效)。台湾今后也会差不多。
国会一旦提出新的关于台湾的法案,无论是军售,亦或是改善台湾的国际地位等等,都很容易造成近乎【全票通过】。 ......
然而,公报本身只是行政政府的声明,其效力不如法律。 ......
然而,现在的人们,对于不能证明是否为间谍的走线客,也不太宽容。估计人们会支持一律用“有间谍嫌疑”之类的理由,实行一律驱逐的政策。 ......
但是,有些两党已经形成共识的事,其实是不受太大影响的。例如:把台湾武装成以色列。
所以我估计,中共在川普第2任期的前2年之内,就会对台湾动手。
因为这次GOP在众院优势实在太小了,稍微发生一点差错,钟摆效应会让民主党夺回之。
参议院不好说。如果连参议院也丢了,那川普后两年就可能成为跛脚总统,啥事都干不了。
不服者会选择:明着顺从,其实背地里跟共产党对着干。
众议院估计是个险胜。
上次共和党在众议院也是微弱优势,导致议长难产。
这次应该不会难产,因为有川普在,他只要在台上喊几句,就可以让任何一个人当议长,其它共和党议员不会阻挠。 ......
根据NBC新闻:
https://www.nbcnews.com/politics/immigration/trump-may-deport-hundreds-thousands-migrants-biden-allowed-legally-ent-rcna179357 ......
就是先用民调测量其它选举,比如某个地方议员的选举,然后和民调进行对比,看女性候选人是否严重吃亏,是否和民调严重不符。
如果发生该现象,那得出的差额数字,就是该地隐藏的“害羞的性别歧视者”的百分比。 ......
因为“害羞的川粉”等受访者不诚实回答问题的现象,仍然使得民调失真。
贺锦丽连普选票都输了。
你民主党输得这么惨,总不能反思为啥没去迎合那些“黑命贵零元购”之类的种族主义口号吧?反思搞种族平权搞得过头了?
......
美国出了个川贼东。抗战前没做到【攘外必先安内】,这下麻烦大了。
恭喜美国又创造了世界纪录。
估计是川普险胜。
因为大法官的任命是由总统和参议院共同决定,如果总统是川普,那他就会提名非常有争议的保守派大法官。
......
......
川普险胜29%
其它情况基本可以排除。
我的意见是把第13问算成川普+1,他不是国家英雄,但很多人粉川。
然后把第12问算成贺锦丽+1,因为川黑人数太多了,这些人的票会投给贺锦丽。
◇以【川普】为中心展开
◇极化现象
这个没变
......