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

标签 c++ c multithreading operating-system

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

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/

相关文章:

c++ - 用于检查我们是否拥有有效数独的辅助函数

c++ - 为什么 'CreateEvent' 创建的 HANDLE 在另一个进程中无效?

c - 为什么,当我将 char[] 转换为 int 时,是否会得到按字节反转

Java:使用 ExecutorService 实现并发

python - 如何使用 exec 系统调用使用 C++ 的参数调用 Python 脚本

c++ - 编辑并继续使用 C++?最好使用 Code::Blocks?

c - 如何在结构中存储多数据值并使用它们?

c - 如果字符串在内存中重叠怎么办?

multithreading - SPARK可以正确使用多核吗?

c++ - 来自原始像素数据的损坏的 QImage