📄 c9-08.cs
字号:
// 运用Interlocked类同步线程示例
using System;
using System.Threading;
class SyncResource {
public void Access(Int32 threadNum) {
// 使用Monitor类强迫同步
lock (this) {
// 不管下个条件,每个线程等待前一个线程
if (threadNum % 2 == 0)
Thread.Sleep(2000);
Console.WriteLine("开始同步资源访问(Thread={0})", threadNum);
Thread.Sleep(200);
Console.WriteLine("停止同步资源访问(Thread={0})", threadNum);
}
}
}
// 无论是否锁定,该方法总是按照到达的线程的顺序被调用
class UnSyncResource {
public void Access(Int32 threadNum) {
// 不使用Monitor强迫同步
// 根据线程顺序号调用
if (threadNum % 2 == 0)
Thread.Sleep(2000);
Console.WriteLine("开始异步资源访问(Thread={0})", threadNum);
Thread.Sleep(200);
Console.WriteLine("停止异步资源访问(Thread={0})", threadNum);
}
}
public class App {
static Int32 numAsyncOps = 3;
static AutoResetEvent asyncOpsAreDone = new AutoResetEvent(false);
static SyncResource SyncRes = new SyncResource();
static UnSyncResource UnSyncRes = new UnSyncResource();
public static void Main() {
for (Int32 threadNum = 0; threadNum < 3; threadNum++) {
ThreadPool.QueueUserWorkItem(new WaitCallback(SyncUpdateResource), threadNum);
}
// 等待WaitHandle
asyncOpsAreDone.WaitOne();
Console.WriteLine("\t\n所有同步操作已经完成\t\n");
// 重设将被异步调用的线程数量
numAsyncOps = 3;
for (Int32 threadNum = 0; threadNum < 3; threadNum++) {
ThreadPool.QueueUserWorkItem(new WaitCallback(UnSyncUpdateResource), threadNum);
}
// 等待WaitHandle
asyncOpsAreDone.WaitOne();
Console.WriteLine("\t\n所有异步操作已经完成");
}
static void SyncUpdateResource(Object state) {
// 通过传递一个线程号调用内部同步
SyncRes.Access((Int32) state);
// 对调用线程进行计数
if (Interlocked.Decrement(ref numAsyncOps) == 0)
// 所有线程调用已经完成
asyncOpsAreDone.Set();
}
static void UnSyncUpdateResource(Object state) {
// 通过传递一个线程号调用内部同步
UnSyncRes.Access((Int32) state);
// 对调用线程进行计数
if (Interlocked.Decrement(ref numAsyncOps) == 0)
// 所有线程调用已经完成
asyncOpsAreDone.Set();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -