2012-05-18 133 views
1

我是一个业余爱好者,至少可以说,但我已经提出了一些基本的程序。无论如何,我正在制作一台DVD机器人。硬件方面已经建成,并通过串口工作良好。为了使这件事情起作用,我将不得不制作一个多线程应用程序,我的第一个。线程间共享信息

该应用将需要至少4个线程。 2个用于2个DVD刻录机,一个用于机器人控制,另一个用于指导其他3个线程应该做什么。

我的问题是什么是这些线程之间共享数据的最佳方式。我一直在四处寻找共享类和线程锁,但我感觉我可能会过度复杂化。我知道我可以使用数据库来传递数据,并让每个线程每隔几秒检查一次数据库,但这对我来说并不像想要做到这一点的正确方式。

感谢您的意见。

回答

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

这是为了确保你不会争用问题的最简单方法。每个线程负责确保在访问其内容之前尝试锁定对象。

除此之外,当然有办法来解决这个问题,比如在包含全局数据的类中实现锁定逻辑。它不会得到更难复杂,所以如果你想实现更复杂的东西,你最终必须阅读。

+0

这可能是一个愚蠢的问题,我可能错过了一些简单的东西。但是,如果创建类的新实例(g_data),其他线程将如何访问它,因为它们将拥有自己的g_data实例?我以为我不得不使用像共享成员这样的线程可以传递它们之间的数据? – user1402243

+0

这里的例子假定g_Data是一个由所有线程共享的全局实例。例如,一个类的单个全局实例。 – kprobst

+0

谢谢kprobst,我从来没有做过一个全局实例,看起来像我需要做一些谷歌搜索,看看我能不能找出答案。 – user1402243