grr*_*sel 10 c++ testing concurrency automated-tests mutex
测试互斥锁实现的最佳方法是什么?(有必要实现互斥,重用不是一个可行的选择)
我想到的最好的是让许多(N)并发线程迭代地尝试访问受保护区域(I)次,这具有副作用(例如更新到全局),以便访问+写入的次数可以是计算以确保全局更新的数量正好是(N)*(I).
还有其他建议吗?
正式证明比测试这种东西更好.
测试将告诉你 - 只要你不是不走运 - 这一切都有效.但是测试是一种钝器; 它可能无法执行完全正确的序列以导致失败.
很难测试硬件中可用的每个操作顺序,以确保您的互斥锁在所有情况下都能正常工作.
测试并非没有价值; 它表明你没有做出任何明显的编码错误.
但是你真的需要一个更正式的代码检查来证明它在正确的时间做了正确的事情,这样一个客户端就会原子地抓住正确的互斥锁所需的锁资源.在许多平台上,有一些特殊的指令可以实现这一点,如果你正在使用其中一个,那么你就有机会把它做对了.
同样,您必须证明该版本是原子的.
小智 5
我和其他所有人一样,要最终证明这一点非常困难,我不知道该怎么做 - 我知道这没有帮助!
当您说实现互斥锁并且重用不是一种选择时,是出于技术原因,例如您正在使用的平台/操作系统上没有互斥锁实现还是其他原因?是否包装某种形式的操作系统级别的“锁”并将其称为您的互斥体实现选项,例如,windoze 上的 CriticalSection、posix 条件变量?如果您可以包装较低级别的操作系统锁,那么您获得正确的机会就会高得多。
如果您还没有这样做,请阅读Herb Sutter 的 Effective Concurrency文章。其中应该有一些东西对你有价值。
无论如何,在您的测试中需要考虑一些事项:
祝你好运!
这让我想起了这个关于FIFO 信号量测试的问题。简而言之,我的回答是:
所以你的建议似乎是最好的选择。如果您想增加信心,请使用模糊测试来随机化调度和输入。
归档时间: |
|
查看次数: |
5130 次 |
最近记录: |