如果有一些代码被两个线程同时写入同一个对象,我的理解是它不会产生任何编译时错误,这就是调试多线程程序如此困难的部分原因。但是这会产生运行时错误/异常吗?
有没有人能推荐一些好的多线程调试技术?
谢谢。
发布于 2012-02-15 13:43:35
从两个或多个不同的线程内部访问同一对象不会在运行时或调试器中产生错误,但它很可能会以您不想要的方式干扰对象。
在多线程环境中安全地处理它的方法是使用互斥锁和信号量。对于互斥锁,请检查wikipedia link。
Mutexes通常用于限制一个线程一次只能访问一个对象的情况。
另一方面,信号量是一种更通用的情况(互斥量实际上是信号量的特例),它有一个计数器,即每个线程将根据信号量的激活/停用而增加/减少。当信号量达到0时,它将锁定自身和导致它的线程。有关信号量的更多信息,请查看wikipedia page
如果你想要更具体的建议,那么我建议你给我们关于你的目标操作系统和/或你正在使用的API的信息,因为任何与线程(互斥、信号量等)有关的信息。特定于操作系统
发布于 2012-02-15 15:29:04
两个不同的线程同时写入单个对象或资源会破坏它,这个问题是竞争条件。在多线程程序中,争用条件既不是编译时错误,也不是运行时错误/异常。竞争条件是管理共享资源的一个软件缺陷,也就是进程间通信,并且很糟糕,因为它们破坏了幕后的数据。多次运行相同的程序将导致输出是预期的结果,而在其他时候则不是预期的结果。
通过使用互斥来防止线程中的竞争条件。如果使用互斥锁只有一个对象或资源可用,则例如LCD显示器或单个对象,否则如果存在多个使用信号量,则示例是四个USB端口。资源是数据和设备。数据是变量、对象、数据结构等。设备是LCD显示器、打印机、USB端口等。
将程序看作是一个连续的单线程,并决定需要完成的分离任务,可以省去更多的调试时间。文字处理程序是由几个线程组成的多线程程序。这些线程的假想示例是:读取文本文件、显示文本、保存文本文件,以及可能每五分钟运行一次的自动保存。线程应该是可以执行的操作,并注意字处理器中的所有线程都将文本作为资源。
如果您已经有了code或检查值,请在每个线程中的对象之前和之后使用printf语句,而不是cout。请参阅printf而不是cout here的原因。
所有操作系统都有进程间通信,但API有所不同。Linux使用POSTIX API,Windows使用Win32或Windows API,但使用方式相同。
阅读材料http://drdobbs.com/cpp/199200938?pgno=1
^-将文章中的一些内容总结为所写的内容
发布于 2012-02-15 15:39:23
如果您使用的是linux或OS,那么可以使用valgrind工具之一( hellgrind或drd )来检测没有相应互斥的线程进行的一些内存访问。
然而,这并不是万无一失的,我也不会依赖它来捕捉你所有的问题。对任何共享资源都要非常小心。
https://stackoverflow.com/questions/9288365
复制相似问题