如何最好地测试互斥锁的实现是否正确?(需要实现互斥锁,重用不可行)
我想到的最好方法是使用许多(N)并发线程迭代地尝试访问受保护的区域(I)次,这会产生副作用(例如更新全局变量),以便可以计算访问和写入次数,以确保对全局变量的更新次数正好为(N)*(I)。
还有其他建议吗?
如何最好地测试互斥锁的实现是否正确?(需要实现互斥锁,重用不可行)
我想到的最好方法是使用许多(N)并发线程迭代地尝试访问受保护的区域(I)次,这会产生副作用(例如更新全局变量),以便可以计算访问和写入次数,以确保对全局变量的更新次数正好为(N)*(I)。
还有其他建议吗?
使用类似于互斥锁的东西,我们回到了一个古老的规则:测试只能证明错误的存在,而不能证明不存在。一年的测试可能比仅仅将代码提交检查并询问是否有人看到问题要少。
我和其他人一样,认为这很难被证明,我不知道该怎么做 - 我知道这并没有帮助!
当你说要实现互斥锁并且重用不是一个选项时,是因为技术原因,例如在你使用的平台/操作系统上没有互斥锁实现或者其他原因吗?是否可以包装某种形式的操作系统级别“锁”并将其称为互斥锁实现,例如 Windows 上的 CriticalSection,posix 条件变量?如果您可以包装一个更低级别的操作系统锁定,那么您正确的机会就会大得多。
如果您还没有这样做,请阅读Herb Sutter 的有效并发文章。这些文章中应该有一些对您有用的东西。
无论如何,在测试时需要考虑以下几点:
祝你好运!
如果证明的方法对你来说行不通,那就走测试的路线。一定要测试所有可能的用例。弄清楚这个东西将如何被使用,谁将使用它,同时也要知道它将如何被使用。当你选择测试的方式时,一定要为每个场景运行每个测试很多次(数以百万计、十亿计,尽可能多地利用你所拥有的测试时间)。
尽量随机进行测试,因为随机性将给你在有限数量的测试中覆盖所有情况的最佳机会。确保使用将被使用的数据和可能不被使用但可能被使用的数据,并确保数据不会破坏锁。
顺便说一句,除非你对数学和形式化方法非常了解,否则你根本没有机会真正提出一个证明。