如何证明多线程正在工作?

16 浏览
0 Comments

如何证明多线程正在工作?

如何证明多线程在我的C#程序中起作用?这是一个测试需求。例如,我将不得不在日志记录器类中添加一些锁定(是的,我知道,我不应该自己编写日志记录器类),我需要一个测试用例来证明这个改变会起作用。

0
0 Comments

如何证明多线程工作正常?

这可能听起来是错误的,但事实是你不能用单元测试来证明多线程行为。尽管如此,你可以通过测试增加对代码的信心,而随着时间的推移,它可能真的会出现问题。

多线程代码是许多项目中我存在的噩梦。通常人们/开发人员没有所需的专业知识来做好工作。错误通常在很长一段时间内被忽视,直到有人在实际应用中遇到问题,然后无法复现该问题以确定发生了什么。此外,通过调试来“修复”错误的多线程代码通常不是一种可行的方法。

无论如何,请进行测试,这样做没有任何坏处,并且很容易做到。只需启动N个线程,让它们都等待ManualResetEvent,然后在一个紧密循环中调用你的API几十万次:) 但是,首先我建议你团队中的每个人都进行代码审查。遍历代码的每一行,考虑它在并行执行时的情况。问问自己:

1. 我真的需要这个锁吗?

2. 必须在锁内部的代码最少是什么?

3. 我可以使这个对象/状态成为不可变的,避免使用锁吗?

4. 调用者有任何方法可以在锁内执行代码吗?

5. 检查所有在锁内访问和更改的成员是否使用了"volatile"?

6. 是否正确使用了System.Threading.Thread.MemoryBarrier?

7. 如果涉及多个锁,它们总是按照相同的顺序获取吗?

8. [在这里添加其他内容]

这是非常好的建议,除了第一个陈述。:) 你可以在单元测试中证明关于多线程代码行为的具体事项(例如,你可以证明所有同步方法都遵守了锁的规则,等等)。你不能用单元测试证明你的多线程代码是无错误的 - 但这不是单元测试的目的。

0
0 Comments

如何证明多线程正在工作?这个问题的出现原因是为了测试锁定代码是否正确同步对日志的访问,需要构建一些能够保证争用的测试。这可能需要您重构代码,以便能够注入一个可以任意持有日志锁定的模拟日志写入类。

这是一个广泛的话题,您可以在StackOverflow上找到一些相关的问题,都值得阅读:

- [如何使用线程进行单元测试?](https://stackoverflow.com/questions/314580)

- [如何编写一个自动化的线程安全测试?](https://stackoverflow.com/questions/394900)

- [如何对调度器进行单元测试的策略有哪些?](https://stackoverflow.com/questions/931650)

- [如何对多线程应用进行单元测试?](https://stackoverflow.com/questions/111676)

- [在编写任何锁之前,我应该为多线程问题进行单元测试吗?(.NET C# TDD)](https://stackoverflow.com/questions/791682)

CHESS是一个正在开发中的框架,用于识别“断言违规、死锁、活锁、数据竞争和内存模型错误”。我没有实际使用过它,但它看起来可能非常有帮助。您肯定会想要研究一下CHESS。

0
0 Comments

如何证明多线程工作正常?

你无法证明 🙂 这完全取决于时间,它可能随时崩溃。你必须在心里检查每种可能的情况,这是唯一的方法。这就是为什么很多开发者认为多线程是不可能正确实现的。

+1,测试所有可能的场景几乎是不可能的。如果你始终使用锁来同步对共享数据的访问,尽管这不是从性能角度来看最佳解决方案,但应该是可以的。

使用CHESS可以让你实际测试你的锁定是否正确 - 它使用每个可能的代码路径运行你的线程单元测试。在这里观看关于CHESS的视频:channel9.msdn.com/posts/Peli/…

0