加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 与线程相关的问题并对其进行调试

发布时间:2020-12-16 03:28:55 所属栏目:百科 来源:网络整理
导读:这是我关于内存管理问题的上一篇文章的后续内容.以下是我所知道的问题. 1)数据竞争(原子性违规和数据损坏) 2)订购问题 3)滥用锁定导致死锁 4)heisenbugs 多线程的任何其他问题?怎么解决? 解决方法 埃里克的四个问题清单非常有用.但调试这些问题很困难. 对
这是我关于内存管理问题的上一篇文章的后续内容.以下是我所知道的问题.

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会帮助代码走坏路.但如果不存在坏路径,则不会给出错误警告.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读