这是我对上一篇关于内存管理问题的帖子的跟进。以下是我知道的问题。
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
}
分级锁的妙处在于死锁可能导致断言。借助 FUNC 和 LINE 的一些额外魔法,您可以确切地知道您的线程做了什么坏事。
对于数据竞争和缺乏同步,目前的情况非常糟糕。有一些静态工具可以尝试识别问题。但误报率很高。
我工作的公司 ( http://www.corensic.com ) 有一个名为 Jinx 的新产品,它会主动寻找可能暴露竞态条件的案例。这是通过使用虚拟化技术来控制线程在各种 CPU 上的交错并放大 CPU 之间的通信来实现的。
检查一下。您可能还有几天时间可以免费下载 Beta。
Jinx 特别擅长查找无锁数据结构中的错误。它在寻找其他竞争条件方面也做得很好。很酷的是没有误报。如果您的代码测试接近竞争条件,Jinx 会帮助代码走上错误的道路。但是,如果错误路径不存在,您将不会收到错误警告。
关于c++ - 线程相关问题及调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3515399/