iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++多线程测试要点有哪些
  • 248
分享到

C++多线程测试要点有哪些

2023-06-17 16:06:26 248人浏览 安东尼
摘要

这篇文章主要介绍“c++多线程测试要点有哪些”,在日常操作中,相信很多人在C++多线程测试要点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++多线程测试要点有哪些”的疑惑有所帮助!接下来,请跟着小编

这篇文章主要介绍“c++多线程测试要点有哪些”,在日常操作中,相信很多人在C++多线程测试要点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++多线程测试要点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

★关于设置断点和单步执行

很多同学非常依赖于调试器的断点功能和单步功能。这在单线程情况下倒还好(不过有些单线程但涉及GUI的程序,也会有点麻烦)。至于多线程程序的调试,这两种手段简直就是噩梦的开始。多线程造成的主要问题大都和竞态条件(Race Condition,详细解释看“这里”)有关。而设置断点或单步跟踪可能会严重干扰多线程之间的竞争状态。导致你看到的是一个假象。比如本来有两个线程并发执行,存在某些不和谐的Bug(由竞态引起)。一旦你在某一个线程设置了断点,该线程在断点处停住了,只剩下另一个线程在跑。这时候,并发的场景已经完全被破坏了,你通过调试器看到的可能是一个和谐的场景。

稍微跑一下题。这很类似量子力学的“测不准原理”,观测者的观测行为干扰了被测量的客体,导致观测者看到的是一个干扰后的现象。

★关于Log输出

既然断点和单步不好用。那咋办捏?一个替代方案是输出log日志。它可以有效减轻断点和单步所导致的(针对竞态条件的)副作用。

◇传统Log机制的问题

传统的log输出主要是打印到屏幕或者输出到文件。对于C++而言,标准库内置的类和函数(比如cout、printf、fputs)可能会有线程安全的问题(和编译器的具体实现有关)。尤其是标准流类库(iOStream)的八个全局对象,更是要小心慎用。轻则输出的log文本混杂,重则导致程序崩溃。

鉴于上述原因,应该尽量使用第三方线程库内置的log机制来搞定log输出功能。比如ACE内置的ACE_Log_Msg等。

◇Log函数要短小精悍

在C++多线程测试中的很多情况下,我们会包装一个公用的函数来实现log输出功能。然后在该函数内部调用线程库的log类/函数。为了不影响线程的竞态条件,这个log函数要尽可能简单轻便:不要涉及太多杂七杂八的琐事、千万别进行耗时的操作、尽量不操作一些全局的变量。

◇Log的副作用

不过捏,即使log函数再短小精悍,也还是有可能影响竞态条件(毕竟log也有开销,也要消耗CPU时间)。
万一竞态条件受到log的影响,那就比较棘手了。我以前就碰到过这种情况:加了log,程序没有问题;去掉log,程序随机崩溃。这种情况一般有两种可能:要么是log功能本身有问题,要么是程序的竞态条件非常敏感(连log的开销都会有影响)。

这时候你能依靠的就只有肉眼和人脑了。先把相关的代码和文档仔细看上几遍(***再找其他有经验的人一起Code Review),然后大家一起开动脑筋使劲琢磨。

★关于Debug版本和Release版本

C++程序经常有Debug版本和Release版本的区别。有些时候,这也会导致一些多线程的问题。

由于Debug版本包含了一些调试信息、启用了某些调试机制(比如assert宏)。所以就可能影响到多线程的竞争状态。在倒霉的时候,会碰上Debug版本工作正常,Release版本程序随机崩溃。要避免这种情况,可以考虑下面两个办法:

◇放弃使用Debug版本

你可以干脆放弃使用Debug版本。在这种情况下,你需要考虑把诸如assert之类调试相关的宏替换成自己的一套宏,使得在非Debug版本下也可以生效。

◇两种版本同步的C++多线程测试

使用此方法,程序员平时自测可以使用Debug版本,但是测试人员日常测试的必须是Release版本。具体的操作步骤可以利用每日构建来辅助进行(每日构建的介绍参见“这里”)。一定要避免:在平时仅仅搞Debug版本的测试,等到发布前夕再制作Release版本。这种做法是非常危险的!

★关于C++多线程测试的机器(硬件)

说一个亲身经历、印象深刻的事情。

当年用ACE开发跨平台程序的时候,公司内的的开发环境和测试环境都是单CPU的机器。因为当时多核的机器还没有面世,多CPU的机器又挺贵,公司没舍得花钱配置。

软件开发完之后,测试人员经过几轮回归测试,也没发现太大问题。但是拿到客户的环境中运行,却经常会随机性崩溃。因为不能在客户环境中Debug,自己的环境又死活没问题,开发组的几个人只好充分发挥肉眼和人脑的功能(盯着代码和设计文档猛想)。经过N长时间,差点把脑袋想破,***才意识到客户的机器是多CPU的。然后赶紧从其它部门借了一台多CPU机器,装上软件调试,***查出是一个第三方库有问题。此事过后,我立即想出各种法子,去申请了几台多CPU机器给测试人员用。

由于上述的前车之鉴,所以我强烈建议:如果是开发多线程的应用程序,尽量给每一个编程人员和测试人员都配置多核/多CPU的机器。毕竟现在多核机器已经很普及了,即使多CPU的机器,价格也还凑合。实在没必要为了省那点小钱而引入开发风险(不光会浪费开发/测试人员的时间,还可能增加实施和维护的成本)。

到此,关于“C++多线程测试要点有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C++多线程测试要点有哪些

本文链接: https://www.lsjlt.com/news/290831.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++多线程测试要点有哪些
    这篇文章主要介绍“C++多线程测试要点有哪些”,在日常操作中,相信很多人在C++多线程测试要点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++多线程测试要点有哪些”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • C++多线程调试和测试的注意事项有哪些
    这篇文章主要讲解了“C++多线程调试和测试的注意事项有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++多线程调试和测试的注意事项有哪些”吧!一、关于设置断点和单步执行 很多同学非常依...
    99+
    2023-06-17
  • C#多线程有哪些优缺点
    这篇文章主要为大家展示了“C#多线程有哪些优缺点”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#多线程有哪些优缺点”这篇文章吧。一、C#多线程相关的基本概念进程:当一个程序开始运行时,它就是一...
    99+
    2023-06-17
  • C#多线程的知识点有哪些
    这篇文章主要介绍“C#多线程的知识点有哪些”,在日常操作中,相信很多人在C#多线程的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#多线程的知识点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • C++ Test有哪些测试
    这篇文章主要介绍“C++ Test有哪些测试”,在日常操作中,相信很多人在C++ Test有哪些测试问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++ Test有哪些测试”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • CSS面试要点有哪些
    这篇文章主要介绍“CSS面试要点有哪些”,在日常操作中,相信很多人在CSS面试要点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS面试要点有哪些”的疑惑有所帮助!接...
    99+
    2024-04-02
  • Java中多线程面试题有哪些
    这篇文章将为大家详细讲解有关Java中多线程面试题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。进程和线程进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是从...
    99+
    2023-06-14
  • Android的线程、多线程和线程池面试题有哪些
    这篇“Android的线程、多线程和线程池面试题有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android的线程、多...
    99+
    2023-06-04
  • 数据库测试的主要测试内容有哪些
    这篇文章主要介绍数据库测试的主要测试内容有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据库测试的测试内容:1、数据库连接测试;2、数据库的健壮性,容错性和恢复能力测试;3、数据库的安全测试;4、数据库的性能测...
    99+
    2023-06-14
  • C++ 多线程程序测试的挑战和策略
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • C++有哪些学习要点
    本篇内容介绍了“C++有哪些学习要点”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 内联函数(inline)在实现上实际和宏类似,在内联函数...
    99+
    2023-06-17
  • C++学习要点有哪些
    这篇文章主要介绍“C++学习要点有哪些”,在日常操作中,相信很多人在C++学习要点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++学习要点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧! 传...
    99+
    2023-06-17
  • Java线程面试题的知识点有哪些
    本篇内容主要讲解“Java线程面试题的知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程面试题的知识点有哪些”吧!一、sychronied 修饰普通方法和静态方法的区别?什么...
    99+
    2023-07-02
  • python中多线程的优缺点有哪些
    本篇文章给大家分享的是有关python中多线程的优缺点有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的数据类型有哪些python的数据类型:1. 数字类型,包...
    99+
    2023-06-14
  • 服务器多线程的优点有哪些
    这篇文章主要介绍“服务器多线程的优点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“服务器多线程的优点有哪些”文章能帮助大家解决问题。尽管面临很多挑战,多线程有一些优点使得它一直被使用。这些优点...
    99+
    2023-06-17
  • Java多线程基础知识点有哪些
    这篇文章主要为大家展示了“Java多线程基础知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java多线程基础知识点有哪些”这篇文章吧。一、线程什么是线程:线程是进程的一个实体,是CP...
    99+
    2023-06-25
  • JAVA有哪些常见的多线程面试题
    本文小编为大家详细介绍“JAVA有哪些常见的多线程面试题”,内容详细,步骤清晰,细节处理妥当,希望这篇“JAVA有哪些常见的多线程面试题”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是线程线程是操作系统能够进...
    99+
    2023-06-04
  • Web安全测试知识点有哪些
    这篇文章主要介绍“Web安全测试知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Web安全测试知识点有哪些”文章能帮助大家解决问题。什么是安全测试?安全测试就是要提供证据表明,在面对敌意和...
    99+
    2023-06-05
  • Web测试入门知识点有哪些
    本篇内容介绍了“Web测试入门知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Web应用程序应用程序有两种模式,C/S和B/S...
    99+
    2023-06-05
  • Android面试的重点要点题有哪些
    这篇文章给大家分享的是有关Android面试的重点要点题有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。正文整个面试题分为三个部分:Java、Android和项目经验。Java技术Java基础对抽象、继承、多...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作