C#多线程的用法之线程间的协作

键词:ManualResetEvent:手动重置事件,它用于线程间同步时用法非常简单也易于理解。

private static void MultiThreadSynergicWithManualResetEvent()
        {
             
            ManualResetEvent mre = new ManualResetEvent(false);
 
            Thread thread1 = new Thread(() =>
            {
               
                mre.WaitOne();
                mre.Reset();
                Console.WriteLine("thread1 work");
                mre.Set();
                Thread.Sleep(1000);
            });
            thread1.Start();
 
            Thread thread2 = new Thread(() =>
            {
                mre.WaitOne();
                Console.WriteLine("thread2 work");
                Thread.Sleep(1000);
            });
            thread2.Start();
            mre.Set();
        }
说明:

1、ManualResetEvent mre = new ManualResetEvent(false)创建一个手动重置事件。initialState参数值为false,表示创建后是否自动发出重置事件通知,false不自动发出。

2、在线程启动后执行mre.Set(),表示向需要通知事件的线程发出mre通知。

3、线程内部mre.WaitOne(),表示线程需要等待mre通知的到来后才能继续执行,线程现在处于等待状态。

4、线程内部mre.WaitOne()后跟mre.Reset(),表示线程得到mre通知后,调用Reset终止通知的向下传递,哪个线程先执行mre.Reset(),它就独占该通知。

5、线程内部mre.Set(),线程执行完必要功能后,再次启动通知并向下传递
-----------------------------------
©著作权归作者所有:来自51CTO博客作者聪聪大神的原创作品,请联系作者获取转载授权,否则将追究法律责任
C#多线程的用法之线程间的协作
https://blog.51cto.com/u_16371710/8900410

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C# 中,可以使用锁 (lock) 语句来实现多线程的互斥操作。锁语句用于保护共享资源,防止多个线程同时对其进行访问和修改。 锁语句的基本语法如下: ``` lock (lockObject) { // 线程安全的代码块 } ``` 其中,`lockObject` 是一个对象实例,用于表示被保护的共享资源。在执行锁语句时,如果当前对象没有被锁定,则该对象被锁定,并且线程可以进入代码块执行线程安全的操作。如果当前对象已经被锁定,则线程将被阻塞,直到该对象被释放为止。 在使用锁语句时,需要注意以下几点: 1. 锁对象应该是所有线程共享的,否则锁语句不起作用。 2. 锁对象应该是引用类型,否则锁语句不起作用。 3. 锁对象应该是唯一的,否则会出现死锁的情况。 4. 锁语句应该放在需要保护的代码块周围,而不是整个方法或类中。 下面是一个简单的示例代码,演示了如何使用锁语句实现多线程互斥: ``` class Program { static int counter = 0; static object lockObject = new object(); static void Main(string[] args) { Thread t1 = new Thread(Increment); Thread t2 = new Thread(Increment); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine("Counter: {0}", counter); } static void Increment() { for (int i = 0; i < 100000; i++) { lock (lockObject) { counter++; } } } } ``` 在这个示例中,我们定义了一个静态变量 `counter`,用于记录计数器的值。我们还定义了一个静态对象 `lockObject`,用于表示被保护的共享资源。在 `Increment` 方法中,我们使用锁语句保护对 `counter` 变量的访问和修改。在 `Main` 方法中,我们创建了两个线程分别执行 `Increment` 方法,并等待它们执行完毕后输出计数器的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王甜甜(.NET)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值