gpt4 book ai didi

c++ - 线程相关问题及调试

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:51 25 4
gpt4 key购买 nike

这是我对上一篇关于内存管理问题的帖子的跟进。以下是我知道的问题。

1)数据竞争(原子性违规和数据损坏)

2)排序问题

3)滥用锁导致死锁

4)海森堡

多线程还有其他问题吗?如何解决?

最佳答案

Eric 列出的四个问题非常准确。但是调试这些问题很困难。

对于死锁,我一直偏爱“水平锁”。本质上,您为每种类型的锁指定了一个级别编号。然后要求线程获取单调的锁。

要进行水平锁定,您可以声明这样的结构:

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
}

分级锁的妙处在于死锁可能导致断言。借助 FUNCLINE 的一些额外魔法,您可以确切地知道您的线程做了什么坏事。

对于数据竞争和缺乏同步,目前的情况非常糟糕。有一些静态工具可以尝试识别问题。但误报率很高。

我工作的公司 ( http://www.corensic.com ) 有一个名为 Jinx 的新产品,它会主动寻找可能暴露竞态条件的案例。这是通过使用虚拟化技术来控制线程在各种 CPU 上的交错并放大 CPU 之间的通信来实现的。

检查一下。您可能还有几天时间可以免费下载 Beta。

Jinx 特别擅长查找无锁数据结构中的错误。它在寻找其他竞争条件方面也做得很好。很酷的是没有误报。如果您的代码测试接近竞争条件,Jinx 会帮助代码走上错误的道路。但是,如果错误路径不存在,您将不会收到错误警告。

关于c++ - 线程相关问题及调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3515399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com