我想添加几个单元测试到我的代码,也因为我加载插件我不总是有权访问我正在运行的代码。 我真的想检查的测试是否我所调用的函数是无锁的?如何(单元)测试函数是否锁定空闲?
是否有任何钩子或方法来测试如果在我的程序中的A点和B点之间存在对非锁定自由函数的调用?
另一个不那么复杂的函数是如何将所有调用挂接到锁定函数(如锁,系统调用...)。我知道如何挂钩调用malloc在Windows上,但没有别的。
谢谢您的帮助
我想添加几个单元测试到我的代码,也因为我加载插件我不总是有权访问我正在运行的代码。 我真的想检查的测试是否我所调用的函数是无锁的?如何(单元)测试函数是否锁定空闲?
是否有任何钩子或方法来测试如果在我的程序中的A点和B点之间存在对非锁定自由函数的调用?
另一个不那么复杂的函数是如何将所有调用挂接到锁定函数(如锁,系统调用...)。我知道如何挂钩调用malloc在Windows上,但没有别的。
谢谢您的帮助
你不能。
您可以用pthread_lock
的不同实现替代,但代码可以直接调用例如futex
,如果您替换该代码仍然可以直接使用syscall(SYS_futex,...)
调用它。您可以剖析代码或使用类似strace
的东西来检测所有此类调用,但仍不会告诉您代码是否在程序集中实现了自己的自定义螺旋锁。
我敢肯定你不能这样做,没有插装锁,或者类似的东西。
我们可以想出很多情况,其中锁定函数的调用在测试中会导致不同的行为[可能只有在“启用特定测试模式以识别测试时”时)才会比生产代码中的行为更糟糕 - 例如,add睡眠100ms进入锁定方法,并尝试使用另一个锁定功能,并将时间与“没有竞争对手的锁相比较。”
或者我们可以保留一个锁定呼叫的计数,并查看计数之前和在功能相同之后(或者已经增加了预期的数量,如果该功能应该呼叫lock
一定次数)。
但是一种通用的方式是侵入锁定机制,我敢肯定这是不可能的。
当然,代码审查和明确的文档,关于哪些代码调用锁定,哪些不会也很有用 - 以及出色的审阅者发现错误。
由于其他人已经回答,因此无法测试算法是否无锁。但是,可以测试它在多线程环境中的行为一致性。我在这个领域的经验是只使用一个无锁队列(我自己写的,但是基于一篇学术论文),所以我的测试是基于一个可能对你有用或不可用的队列。
我使用多个线程来测试锤队列。
在我的测试中,我也改变了读者和作者的数量。根据读者与作者的比例,队列行为将有所不同。读者多于作者通常会导致几乎为空的队列,而反过来会导致队列不断扩大,直到作者停止写入。
第2点可能是你感兴趣的,因为你一般可以根据重负载下响应时间的变化来判断算法是否是无锁的或不是。如果响应时间在重负载下保持快速,那么您可以推断该算法是无锁的。或者至少如果不是,它的行为如果是。
正如我所说我没有控制功能的代码悲伤 – dzada
我的答案是,这样做不会工作。 –
是的,这是真的对不起。事情也是,我正在macosx和windows上工作。但是,除了用户编写自己的旋转锁定以外的所有系统调用都不是什么大问题。因为,这就好像他基本上是在等待原子的写作一样,我知道我不会理解这一点。我并不是在寻找完美的解决方案,我正在寻找一种很好的方法来捕捉我的代码的用户可能做的大部分内容 – dzada