1

至少可以说我是一个业余爱好者,但我已经做了一些基本的程序。无论如何,我正在制作一个DVD更换机器人。硬件方面已经构建,并且可以通过串行端口很好地工作。为了使这件事发挥作用,我将不得不制作一个多线程应用程序,这是我的第一个。

该应用程序至少需要 4 个线程。2 个用于 2 个 DVD 刻录机,一个用于机器人控制,一个我正在调用一个导演,它将告诉其他 3 个线程该做什么。

我的问题是在这些线程之间共享数据的最佳方式是什么。我一直在研究共享类和线程锁,但我觉得我可能过于复杂了。我知道我可以使用数据库来传递数据并让每个线程每隔几秒钟检查一次数据库,但这对我来说并不是正确的方法。

感谢您的建议。

4

1 回答 1

3

您可以将所需的任何数据传递给该Thread.Start()方法。这基本上是线程之间共享内容的首选方式。但是,在基本层面上,如果多个线程将访问其他线程也将访问的内容,则需要建立某种锁定机制以确保不会出现争用问题。

假设您有一个全局级别的类实例,在您的线程之间共享:

(这是 C# 但你明白了)

class GlobalData {

    public string SomeProperty {get; set; }
    public int SomeOtherProperty {get; set; }

}

多个线程同时访问这些属性中的任何一个(或期望值在调用之间保持一致)的情况会很麻烦。所以最简单的方法是创建一个线程负责的锁定机制:

class GlobalData {

    public object Sentry = new object();

    public string SomeProperty {get; set; }
    public int SomeOtherProperty {get; set; }
}

在运行线程的代码中,你会做这样的事情(假设g_Data是类的实例):

void SomeMethodRunningOnAThread() {
    lock (g_Data.Sentry) {
        // do stuff    
    }
}

(在 VB.NET 中相当于lockSyncLock

这是确保您不会陷入争用问题的最简单方法。每个线程负责确保它们在访问对象内容之前尝试锁定对象。

除此之外,当然还有一些方法可以解决这个问题,例如在包含全局数据的类中实现锁定逻辑。它并没有变得不那么复杂,所以如果你想最终实现更复杂的东西,你无论如何都必须阅读。

于 2012-05-18T01:10:26.377 回答