如何测试是否正确实现了无锁队列?

时间:2013-09-12 01:46:33

标签: c multithreading testing data-structures lock-free

我使用GCC __sync_xxx_compare_and_swap原子内置实现了一个无锁队列。现在我想确保我的代码是正确的。所以我为入队和出队启动了多个线程,并试图:

  • 测量入队和出队操作的数量,并检查它们是否匹配
  • 测量单个元素入队和出队的次数,并检查每个元素的数量是否为2(1个入队和1个出队)

我发现以上两个结果都是正确的,但是如何验证排队顺序与出列顺序完全相同?或者,有没有办法检查我的实现的正确性?

1 个答案:

答案 0 :(得分:0)

试试Helgrind: a thread error detector。它是Valgrind的一部分。除了默认选项之外,请务必阅读手册页以获取额外的好处。

至于检查重新订购

  1. 仅生成不同的项目
  2. 记录每个线程日志(该线程中的局部变量,而不是单个全局日志文件)中的每个线程的每个操作(en-& de-queue);这不需要同步
  3. 当每个线程即将结束时,将其日志保存在日志文件中。
  4. 当程序退出时,您应该能够在日志文件中匹配队列和队列。

    这比在测试期间记录到单个日志文件(受互斥锁保护)更好,因为它避免了同步瓶颈(这会影响线程的动态和可能性)使测试不太相关)