您可以将想要的任何数据传递给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相当于lock
是SyncLock
)
这是为了确保你不会争用问题的最简单方法。每个线程负责确保在访问其内容之前尝试锁定对象。
除此之外,当然有办法来解决这个问题,比如在包含全局数据的类中实现锁定逻辑。它不会得到更难复杂,所以如果你想实现更复杂的东西,你最终必须阅读。
这可能是一个愚蠢的问题,我可能错过了一些简单的东西。但是,如果创建类的新实例(g_data),其他线程将如何访问它,因为它们将拥有自己的g_data实例?我以为我不得不使用像共享成员这样的线程可以传递它们之间的数据? – user1402243
这里的例子假定g_Data是一个由所有线程共享的全局实例。例如,一个类的单个全局实例。 – kprobst
谢谢kprobst,我从来没有做过一个全局实例,看起来像我需要做一些谷歌搜索,看看我能不能找出答案。 – user1402243