我有两个主题。如何从thread1获取数据到thread2。这意味着,当thread1完成其工作时,它有一些数据,并且这些数据必须在第二个" thread2"中使用。如何实现它?
这是代码,但该怎么办......现在?
static void Main(string[] args)
{
Thread t1 = new Thread(thread1);
t1.Start();
Thread t2 = new Thread(thread2);
t2.Start();
}
static void thread1()
{
string newstring="123";
}
static void thread2()
{
//what to do here...what code will be here?
Console.WriteLine(newstring);
}
在thread1中可以是任何东西,但我需要得到这个"无论什么",而不是我可以在thread2中使用它
答案 0 :(得分:2)
两个线程使用的数据必须在两个线程之间共享。
通常称为公共资源。
其中一个你必须注意到你必须在这里实现synchronization。
由于两个线程都是独立运行的,并且还在读取/写入公共数据,因此Race Condition的可能性非常高。为了防止这种情况,您必须在读/写数据上实现同步(在公共对象上)。
引用下面的代码,其中CommonResource
在两个线程之间是通用的,locking
在您的示例中,一个线程正在写入数据,而其他线程正在读取数据。如果我们不实现同步,则有可能在线程1正在写入新数据时,但线程2(因为它不等待线程1完成它的任务优先)将带来旧数据(或数据无效。)
当有多个线程正在写入数据时情况变得最糟,而不等待其他线程完成写入。
public class CommonResourceClass
{
object lockObj;
//Note: here main resource is private
//(thus not in scope of any thread)
string commonString;
//while prop is public where we have lock
public string CommonResource
{
get
{
lock (lockObj)
{
Console.WriteLine(DateTime.Now.ToString() + " $$$$$$$$$$$$$$$ Reading");
Thread.Sleep(1000 * 2);
return commonString;
}
}
set
{
lock (lockObj)
{
Console.WriteLine(DateTime.Now.ToString() + " ************* Writing");
Thread.Sleep(1000 * 5);
commonString = value;
}
}
}
public CommonResourceClass()
{
lockObj = new object();
}
}
和线程调用就像
static CommonResourceClass commonResourceClass;
static void Main(string[] args)
{
commonResourceClass = new CommonResourceClass();
Thread t1 = new Thread(ThreadOneRunner);
Thread t2 = new Thread(ThreadTwoRunner);
t1.Start();
t2.Start();
}
static void ThreadOneRunner()
{
while(true)
{
Console.WriteLine(DateTime.Now.ToString() + " *******Trying To Write");
commonResourceClass.CommonResource = "Written";
Console.WriteLine(DateTime.Now.ToString() + " *******Writing Done");
}
}
static void ThreadTwoRunner()
{
while(true)
{
Console.WriteLine(DateTime.Now.ToString() + " $$$$$$$Trying To Read");
string Data = commonResourceClass.CommonResource;
Console.WriteLine(DateTime.Now.ToString() + " $$$$$$$Reading Done");
}
}
输出:
注意,读取时间为2秒,写入时间为5秒,因此读取速度应该更快。但如果正在进行写作,阅读必须等到写完。
你可以在输出中清楚地看到,当一个线程试图读取或写入时,当其他线程正在执行它的任务时,它无法做到。