一个简单的C#多线程间同步的例子

本博客有关多线程的文章:


在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。

这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。

代码如下:

using  System;
using  System.Collections;
using  System.Collections.Generic;
using  System.Threading;

///   <summary>
///  在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
///
/// 这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
/// 作者:周公
///  时间:2008-5-17
///  原发地址: http://blog.csdn.net/zhoufoxcn
///   </summary>
public   class  ThreadDemo
{
    
private  Thread threadOne;
    
private  Thread threadTwo;
    
private  ArrayList stringList;
    
private   event  EventHandler OnNumberClear; // 数据删除完成引发的事件
     public   static   void  Main()
    {
        ThreadDemo demo 
=   new  ThreadDemo( 1000 );
        demo.Action();
    }
    
public  ThreadDemo( int  number)
    {
        Random random 
=   new  Random( 1000000 );
        stringList 
=   new  ArrayList(number);
        
for  ( int  i  =   0 ; i  <  number; i ++ )
        {
            stringList.Add(random.Next().ToString());
        }
        threadOne 
=   new  Thread( new  ThreadStart(Run)); // 两个线程共同做一件事情
        threadTwo  =   new  Thread( new  ThreadStart(Run)); // 两个线程共同做一件事情
        threadOne.Name  =   " 线程1 " ;
        threadTwo.Name 
=   " 线程2 " ;
        OnNumberClear 
+=   new  EventHandler(ThreadDemo_OnNumberClear);
        
    }
    
///   <summary>
    
///  开始工作
    
///   </summary>
     public   void  Action()
    {
        threadOne.Start();
        threadTwo.Start();
    }
    
///   <summary>
    
///  共同做的工作
    
///   </summary>
     private   void  Run()
    {
        
string  stringValue  =   null ;
        
while  ( true )
        {
            Monitor.Enter(
this ); // 锁定,保持同步
            stringValue  =  ( string )stringList[ 0 ];
            Console.WriteLine(Thread.CurrentThread.Name 
+   " 删除了 "   +  stringValue);
            stringList.RemoveAt(
0 ); // 删除ArrayList中的元素
             if  (stringList.Count  ==   0 )
            {
                OnNumberClear(
this new  EventArgs()); // 引发完成事件
            }
            Monitor.Exit(
this ); // 取消锁定
            Thread.Sleep( 5 );
        }
    }

    
// 执行完成之后,停止所有线程
     void  ThreadDemo_OnNumberClear( object  sender, EventArgs e)
    {
        Console.WriteLine(
" 执行完了,停止了所有线程的执行。 " );
        threadTwo.Abort();
        threadOne.Abort();
        
    }
}

说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程(主要是回答csdn论坛的一个朋友的问题才用了这种办法)。


更多资讯,请关注本人微信订阅号:


  • 6
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 84
    评论
C#中,我们可以使用线程同步技术来确保多个线程的正确协调和互斥访问共享资源。以下是一些常用的线程同步技术: 1. 互斥锁(Mutex):互斥锁是一种最基本的线程同步机制,它确保在任何时候只有一个线程可以访问被保护的资源。通过`lock`关键字或`Mutex`类来实现互斥锁。 ```csharp private static readonly object lockObject = new object(); lock (lockObject) { // 访问共享资源的代码 } ``` 2. 信号量(Semaphore):信号量是一种计数器,它限制同时访问某个资源的线程数量。通过`Semaphore`类来实现信号量。 ```csharp private static Semaphore semaphore = new Semaphore(2, 2); // 允许同时两个线程访问 semaphore.WaitOne(); // 请求访问资源 try { // 访问共享资源的代码 } finally { semaphore.Release(); // 释放资源 } ``` 3. 事件(Event):事件是一种线程的通信机制,它允许一个或多个线程等待某个操作完成。通过`ManualResetEvent`或`AutoResetEvent`类来实现事件。 ```csharp private static ManualResetEvent eventObject = new ManualResetEvent(false); // 初始状态为非终止状态 // 线程1等待事件 eventObject.WaitOne(); // 线程2触发事件 eventObject.Set(); ``` 4. 互斥体(Monitor):互斥体是一种特殊的内核对象,它提供了一种同步机制,确保只有一个线程可以进入临界区。通过`Monitor`类来实现互斥体。 ```csharp private static readonly object lockObject = new object(); Monitor.Enter(lockObject); try { // 访问共享资源的代码 } finally { Monitor.Exit(lockObject); } ``` 这些线程同步技术可以帮助你在多线程环境中实现线程安全和资源互斥访问。根据实际需求,选择适合的同步机制来确保线程的正确协调。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 84
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周公

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值