1)数据竞争(原子性违规和数据损坏)
2)订购问题
3)滥用锁定导致死锁
4)heisenBUGs
多线程的任何其他问题?怎么解决?
解决方法 埃里克的四个问题清单非常有用.但调试这些问题很困难.对于僵局,我总是喜欢“水平锁”.基本上,您为每种类型的锁提供一个级别编号.然后要求线程获取单调的锁.
要做成水平锁,你可以声明一个这样的结构:
typedef struct { os_mutex actual_lock; int level; my_lock *prev_lock_in_thread;} my_lock_struct;static __tls my_lock_struct *last_lock_in_thread;voID my_lock_aquire(int level,*my_lock_struct lock) { if (last_lock_in_thread != NulL) assert(last_lock_in_thread->level < level) os_lock_acquire(lock->actual_lock) lock->level = level lock->prev_lock_in_thread = last_lock_in_thread last_lock_in_thread = lock}
关于水平锁的好处是死锁导致断言的可能性.通过FUNC和liNE的一些额外魔法,你可以确切地知道你的线程做了什么.
对于数据竞争和缺乏同步,目前的情况非常糟糕.有一些静态工具可以尝试识别问题.但误报率很高.
我工作的公司(http://www.corensic.com)有一个名为Jinx的新产品,它积极寻找可以暴露竞争条件的案例.这是通过使用虚拟化技术来控制各种cpu上的线程交错并放大cpu之间的通信来完成的.
看看这个.您可能还有几天免费下载Beta版.
Jinx特别擅长在无锁数据结构中发现错误.它在寻找其他竞争条件方面也做得非常好.什么是酷的,没有误报.如果你的代码测试接近竞争条件,Jinx会帮助代码走坏路.但如果不存在坏路径,则不会给出错误警告.
总结以上是内存溢出为你收集整理的c – 与线程相关的问题并对其进行调试全部内容,希望文章能够帮你解决c – 与线程相关的问题并对其进行调试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)