C#中的原子操作

Posted zhaotianff

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中的原子操作相关的知识,希望对你有一定的参考价值。

技术图片

某天,我同学发给我这样一道题。看着还是挺简单的,我当时 就想到了线程等待。

使用AutoResetEvent类来两个线程互相等待,互相通知

 1  class Program
 2     {
 3         static AutoResetEvent autoResetEvent1 = new AutoResetEvent(false);
 4         static AutoResetEvent autoResetEvent2 = new AutoResetEvent(false);
 5 
 6         static void Main(string[] args)
 7         {
 8             new Thread(Print1).Start();
 9             new Thread(Print2).Start();
10         }
11 
12         static void Print1()
13         {
14             for (int i = 1; i < 100; i+=2)
15             {            
16                 Console.WriteLine(i.ToString() + "   at thread id:  " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
17                 autoResetEvent1.Set();
18                 autoResetEvent2.WaitOne();                           
19             }
20         }
21 
22         static void Print2()
23         {
24             for (int i = 2; i < 100; i+=2)
25             {
26                 autoResetEvent1.WaitOne();
27                 Console.WriteLine(i.ToString() + "   at thread id:  " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
28                 autoResetEvent2.Set();
29             }
30         }
31     }

事实证明,这个方法是可行的。原理就是线程2等待线程1事件的发生,线程1等待线程2事件的发生。因为线程1是先跑起来的,就保证了这样一种操作的可行性。

最后运行结果如下:

技术图片

但个人觉得不够理想。目前还在学习阶段,也说不起为啥不理想,可能 就是单纯的认为吧。

最后请教了同学,看他的做法。他给出的java代码如下

 1 import java.util.concurrent.atomic.AtomicInteger;
 2 
 3 public class Exeaple {
 4 
 5     private static AtomicInteger aInt = new AtomicInteger(0);
 6 
 7     public static void main(String[] args) {
 8         Thread1 thread1 = new Thread1("thread - 1");
 9         Thread2 thread2 = new Thread2("thread - 2");
10         thread2.start();
11         thread1.start();
12     }
13 
14     static class Thread1 extends Thread {
15         private String threadName;
16         public Thread1(String threadName) {
17             this.threadName = threadName;
18         }
19         @Override
20         public void run() {
21             while (aInt.get() <= 20) {
22                 if (aInt.get() % 2 == 1) {
23                     System.out.println(threadName + ":" + aInt.get());
24                     aInt.incrementAndGet();
25                 }
26             }
27         }
28     }
29 
30     static class Thread2 extends Thread {
31         private String threadName;
32         public Thread2(String threadName) {
33             this.threadName = threadName;
34         }
35         @Override
36         public void run() {
37             while (aInt.get() <= 20) {
38                 if (aInt.get() % 2 == 0) {
39                     System.out.println(threadName + ":" + aInt.get());
40                     aInt.incrementAndGet();
41                 }
42             }
43         }
44     }
45 
46 }

 

以上是关于C#中的原子操作的主要内容,如果未能解决你的问题,请参考以下文章

C#程序员经常用到的10个实用代码片段 - 操作系统

XSS:如何从 C# 中的字符串中删除 JS 片段?

C# 多线程系列原子操作

C#程序员经常用到的10个实用代码片段

比较 C# 中的字符串片段并从集合中删除项目

C++11多线程 原子操作概念及范例