1

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

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

发现上面两个结果都是正确的,但是如何验证入队顺序和出队顺序完全一样呢?或者,有什么方法可以检查我的实现的正确性吗?

4

1 回答 1

0

试试Helgrind:一个线程错误检测器。它是 Valgrind 的一部分。请务必阅读手册页以了解除了默认选项之外可以启用的额外好处。

至于检查重新订购

  1. 只生成不同的项目
  2. 在每个线程日志中记录每个线程的每个操作(入队和出队)(该线程中的局部变量,而不是单个全局日志文件!);这不需要同步
  3. 当每个线程即将结束时,将其日志保存在日志文件中。

当程序退出时,您应该能够匹配日志文件中的入队和出队。

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

于 2013-09-12T05:09:08.783 回答