C++ 如何(单元)测试函数是否无锁?

C++ 如何(单元)测试函数是否无锁?,c++,multithreading,c++11,hook,lock-free,C++,Multithreading,C++11,Hook,Lock Free,我想在我的代码中添加几个单元测试,在加载插件时,我并不总是能够访问正在运行的代码。 我真正想检查的测试是我调用的函数是否没有锁? 是否有任何钩子或方法来测试我的程序中的a点和B点之间是否有对非无锁函数的调用 另一个不太复杂的函数是如何将所有调用挂接到锁定函数(如锁、系统调用…)。我知道如何在windows上挂接对malloc的调用,但除此之外什么都不知道 感谢您的帮助我很确定,如果不安装锁或类似的东西,您就无法做到这一点 可能会出现许多场景,其中锁定函数的调用会导致测试中的行为(可能仅在启用“识

我想在我的代码中添加几个单元测试,在加载插件时,我并不总是能够访问正在运行的代码。 我真正想检查的测试是我调用的函数是否没有锁?

是否有任何钩子或方法来测试我的程序中的a点和B点之间是否有对非无锁函数的调用

另一个不太复杂的函数是如何将所有调用挂接到锁定函数(如锁、系统调用…)。我知道如何在windows上挂接对malloc的调用,但除此之外什么都不知道


感谢您的帮助

我很确定,如果不安装锁或类似的东西,您就无法做到这一点

可能会出现许多场景,其中锁定函数的调用会导致测试中的行为(可能仅在启用“识别测试的特殊测试模式”时)与生产代码中的行为不同——例如,在锁定方法中添加100ms睡眠,并尝试使用另一个锁定函数,并将时间与“锁没有竞争对手

或者我们可以保留一个要锁定的调用计数,看看函数前后的计数是否相同(或者如果函数应该调用
lock
一定次数,则计数增加了预期的数量)

但是一种通用的方式不会侵入锁定机制,我很确定这是不可能的

当然,代码审查和明确文档中哪些代码称为锁,哪些代码称为锁,哪些代码不称为锁也会很有用,而且优秀的审查人员会发现错误

你不能


您可以替换
pthread\u lock
的不同实现,但代码可以直接调用,例如
futex
,如果替换,代码仍然可以直接调用
syscall(SYS\u futex,…)
。您可以分析代码或使用类似于
strace
的方法来检测所有此类调用,但这仍然不能告诉您代码是否在程序集中实现了自己的自定义自旋锁。

由于其他人已经回答了,因此无法测试算法是否无锁。但是,可以测试它在多线程环境中的行为是否一致。我在这方面的经验只是使用了一个无锁队列(这是我自己写的,但基于一篇学术论文),所以我的测试基于一个队列,这个队列可能对您有用,也可能对您没有用处

我使用了多个线程来测试这个队列

  • 线程安全:队列不能在重载下崩溃
  • 速度:在重载下,响应时间如何变化
  • 一致性:队列中不得有散件
  • 在我的测试中,我还改变了读者和作者的数量。根据读写器的比率,队列的行为将有所不同。读卡器多于写卡器通常会导致队列几乎为空,反之则会导致队列不断扩展,直到写卡器停止写入


    第2点可能会引起您的兴趣,因为您通常可以根据重负载下响应时间的变化来判断算法是否无锁。如果在重载情况下响应时间保持快速,则可以推断该算法是无锁的。或者至少如果它不是,它的行为就像它是一样。

    正如我所说,我对调用的函数的代码没有控制权,因此我不能在调用lock的函数中添加sleep或计数器。我认为你不能使用宏包装锁定功能?那么答案是“不,你不能这样做”。当然,您可以为此目的构建一个“不同的libc”(或者更确切地说,在两者之间插入一个库,它提供了一个可选的锁定功能)。正如我所说的,我对名为sadly的函数的代码没有控制权。我的回答是这样做无论如何都不会起作用。是的,这是真的,对不起。问题是我也在研究macosx和windows。但是,除了用户编写自己的自旋锁时,获取所有系统调用并不是什么大问题。因为,这就像他写了一篇关于原子的繁忙等待,我知道我不会理解。我不是在寻找完美的解决方案,我也在寻找一种好的方法来捕捉我代码的大部分用户可能会做的事情