你如何在同一时刻启动2个线程?

时间:2013-08-13 16:18:04

标签: c# multithreading unit-testing race-condition

对于我正在编写的测试用例,我想在完全相同的时间启动2个线程,目的是强制竞争条件或死锁,以确保我的测试代码正确处理这种情况。我不确定如何在完全相同的时间发出线程信号。有人能告诉我如何在完全相同的时间发出2个线程的信号吗?

worker1.Start()和worker2.Start()调用几乎同时进行,但不足以暴露我正在尝试修复的错误。

这是我的测试用例。

[TestMethod]
public void test()
{
  var target = new TestableErqProtocolTools();
  var firstUri = HEDataScope.Scope.BusinessObjectServerUris[0].AbsoluteUri;

  var worker1 = new Thread(new ThreadStart(target.TestableAddServerUrlsFromScope));
  var worker2 = new Thread(new ThreadStart(target.TestableAddServerUrlsFromScope));

  var startEvent = new EventWaitHandle(false, EventResetMode.ManualReset);

  worker1.Start();
  worker2.Start();

  StringAssert.StartsWith(target.DefaultRemoteServerUrl, firstUri, "DefaultRemoteServerUrl is {0}"
            , String.IsNullOrEmpty(target.DefaultRemoteServerUrl) ? "<empty>" : target.DefaultRemoteServerUrl);      
}

2 个答案:

答案 0 :(得分:4)

你无法控制它,只有一个处理单元,一次只能发生一件事。 您可以做的是使用Barriers在一个逻辑时间内将线程同步到一个位置。

答案 1 :(得分:3)

您无法在同一时间启动线程。您无法在单处理器计算机上执行此操作。并且您无法在多处理器计算机上强制执行它。

所以继续测试很多次。并考虑并行性和多线程问题进行代码审查。