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

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

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、线程间同步

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


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值