|
|
1
70
你将很难复制这个错误。事实上,我想说的是,您将永远无法使用.NET框架复制它。原因是微软的实现使用了一个强大的内存模型来进行写操作。这意味着写操作被当作是不稳定的。volatile写入具有锁释放语义,这意味着所有先前的写入必须在当前写入之前提交。 然而,ECMA规范有一个较弱的内存模型。因此,从理论上讲,Mono甚至未来版本的.netframework可能会开始出现这种错误行为。
拆除障碍物3和4肯定会产生影响。这其实很容易复制。好吧,不是这个例子本身,但下面的代码是一个更知名的演示。它必须使用发行版编译并在调试器外部运行。问题是程序没有结束。您可以通过调用
一些线程错误很难重现的原因是,模拟线程交错的相同策略实际上可以修复错误。
你可以看到我的答案 here |
|
2
10
可能性是 很好,第一个任务在第二个任务开始运行时就完成了。只有当两个线程同时运行代码并且没有中间的缓存同步操作时,才能观察到这种行为。在您的代码中有一个,StartNew()方法将在线程池管理器的某个地方获取一个锁。 让两个线程同时运行此代码是非常困难的 非常 不要 远离这一点,使用lock语句来编写合理的多线程代码。 |
|
|
3
2
|
|
|
4
2
复制多线程错误非常困难-通常您必须多次(数千次)运行测试代码,并进行一些自动检查,以便在错误发生时进行标记。你可以试着加一个短的线程。睡眠(10) 在一些线之间,但它并不总是保证你会得到相同的问题没有它。
|
|
|
5
1
如果您接触过来自两个不同线程的数据,可能会发生这种情况。这是处理器用来提高速度的技巧之一——你可以构建没有这样做的处理器,但是它们会慢得多,所以没有人再这样做了。你应该读一些类似的东西 Hennessey and Patterson 认识到各种各样的比赛条件。 我总是使用某种更高级别的工具,比如监视器或锁,但在内部,它们也在做类似的事情,或者是用屏障实现的。 |
|
|
6
1
我将引用一篇关于多线程的伟大文章:
|