【问题标题】:How to write tests for a multi-threaded producer-consumer C program?如何为多线程生产者-消费者 C 程序编写测试?
【发布时间】:2015-10-12 19:28:26
【问题描述】:

如何为多线程生产者-消费者 C 程序编写好的测试?

我知道 GDB 可用于调试线程,但我相信 GDB 也会停止当前正在调试的线程,而其他线程继续运行。

我想通过我的线程测试正确的互斥锁运气/解锁和阻塞。我环顾四周,但找不到任何好的资源。

我对所有非并发功能进行了单元测试,但想确保我的并发是正确的。如何做到这一点?

【问题讨论】:

  • 我不相信存在一些通用的解决方案。一般来说,您应该对单线程代码执行相同的操作,即测试所有组合。如果您发布具体的小示例,可能会找到特定案例的答案
  • 据我所知,测试并发性非常棘手,尤其是在运行在千兆赫兹区域的现代系统上。特别是对于任何小的东西,如果您尝试首先证明算法的正确性然后编写代码,则相对容易。我会第二个 @Lol4t0,因为不太可能有一个通用的解决方案。
  • @tonysdg,我相信研究算法的正确性是第一步,但您还必须检查您的实现是否与您开发的算法一致。

标签: c multithreading testing gdb


【解决方案1】:

我相信 GDB 也会停止当前正在调试的线程,而其他线程继续运行。

你的想法是错误的:默认情况下 GDB 在all-stop 模式下工作:停止一个线程会停止它们全部

较新的 GDB 版本也有 non-stop 模式,在该模式下其他线程会继续运行,但这不是默认设置。

想确保我的并发是正确的。

不可能通过测试证明并发是正确的。您只能通过编写正确的代码(并仔细检查)来做到这一点。

Clang thread safety analysis 可以提供帮助。在thread sanitizer 下进行测试会有所帮助。 GDB 在这里通常是错误的工具。

【讨论】:

    猜你喜欢
    • 2012-10-13
    • 2018-09-24
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多