在线程之间共享信息

时间:2012-05-18 00:51:44

标签: vb.net multithreading

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

该应用至少需要4个主题。 2个用于2个DVD录像机,一个用于机器人控制,另一个用于控制导演,它将告诉其他3个线程做什么。

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

感谢您的建议。

1 个答案:

答案 0 :(得分: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

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

除此之外,当然还有一些方法可以解决这个问题,例如在包含全局数据的类中实现锁定逻辑。它不会让更少复杂化,所以如果你想要实现更复杂的东西,你最后还是必须阅读。