线程间通信——数据传递和同步

来源:互联网 发布:网络推广客服是干嘛的 编辑:程序博客网 时间:2024/05/30 12:30

线程间通信会产生两个问题:一个是如何传递数据,另一个是如何同步。

1、线程间数据传递

线程被创建后,我们无法利用线程的控制函数将数据从一个线程传递到另一个线程,然而,.NET本身的一个重要特性就是完全面向对象,即所有的函数都是放在类之中,因此,如果我们改变类成员变量的值,这种改变将会被附着在类函数上的线程看到。

线程间通过资源(包括类成员变量)传递数据

例如:下面的例子使用队列在两个线程之间进行数据传递。

  public class SMTPNotification  {    private Queue notificationQueue;    private string serverName;    private Thread sendingThread;    private SmtpClient client = new SmtpClient();    public SMTPNotification()    {      serverName = "";      client.Host = serverName;      notificationQueue = new Queue();      sendingThread = new Thread(new ThreadStart(NotificationMethod));      sendingThread.Start();    }    private void NotificationMethod()    {      while (true)      {        try        {          while (notificationQueue.Count > 0)          {            MailMessage message = (MailMessage)notificationQueue.Dequeue();            client.Send(message);          }          Thread.Sleep(1000);        }        catch (Exception ex)        {          System.Diagnostics.Trace.WriteLine(ex.Message);        }      }    }    public void SendNotification(string to, string from, string subject, string body)    {      MailMessage Message = new MailMessage();      Message.To.Add(to);      Message.From = new MailAddress(from);      Message.Subject = subject;      Message.Body = body;      notificationQueue.Enqueue(Message);    }  }


线程间数据传递会产生两个问题:

1)竞争

两个线程同时修改一个变量,后一个人的修改会覆盖前一个人的修改,这种情况叫做竞争。

2)死锁

当一个线程占用资源A而请求资源B,另一个线程占用资源B而请求资源A,两个线程都无法继续运行,这种情况叫做死锁。


2、线程间同步

线程间同步是指线程之间等待同步的过程。


原创粉丝点击