【发布时间】:2014-07-24 14:52:22
【问题描述】:
我正在尝试解决两个线程的线程同步问题,这两个线程都访问一个资源。在此示例中,该资源是 Engine
这里两次启动正在启动引擎,其中一个线程正在停止它。 目标是得到引擎启动的最终结果
澄清一下:我不控制 ThreadOne/ThreadTwo 中的代码,并且需要在 Lifecycle 类中进行同步。
在此示例中实现这一目标的最佳方法是什么?
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
new Thread(ThreadOne).Start();
new Thread(ThreadTwo).Start();
Console.Read();
}
private static void ThreadOne(object obj)
{
Lifecycle.Start();
Thread.Sleep(500);
Lifecycle.Stop();
}
private static void ThreadTwo(object obj)
{
Thread.Sleep(600);
Lifecycle.Start();
}
}
class Engine
{
public void Start()
{
Console.WriteLine("Engine was started");
}
public void Stop()
{
Console.WriteLine("Engine was stopped");
}
}
static class Lifecycle
{
private static readonly object LockObject;
private static Engine Engine;
static Lifecycle()
{
LockObject = new object();
Engine = new Engine();
}
public static void Start()
{
lock (LockObject)
{
Engine.Start();
Thread.Sleep(800);
}
}
public static void Stop()
{
lock (LockObject)
{
Engine.Stop();
}
}
}
【问题讨论】:
-
您希望最后一件事是线程 2 启动引擎吗?
-
但是线程2有可能在线程1执行
Stop方法之前运行Start吗? -
@YuvalItzchakov 是的,是的。在此示例中,它将启动引擎两次,然后停止一次。而不是开始、停止、开始
-
从外观上看,您希望所有操作按顺序发生。在您的程序中,从来没有任何时间点每个线程都应该同时做某事,您也不希望任何动作交织在一起。因此,解决方案显然是删除所有额外的线程并按顺序运行程序。您添加了一堆线程开销,实际上是零收益。
-
谢谢大家,你们的回答,特别是删除的回答很有帮助。
标签: c# multithreading