鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > .net技术 > WinRT/Metro > >

多线程之线程同步: Lock, Monitor, Interlocked, Mutex, Reader

来源:互联网 作者:佚名 时间:2013-09-17 08:40
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock 作者:webabcd 介绍 重新想象 Windows 8 Store Apps 之线程同步 示例 1、演示 lock 的使用 Thread/Lock/LockDemo.xaml Page x:Cla

[源码下载]


重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock



作者:webabcd


介绍
重新想象 Windows 8 Store Apps 之 线程同步



示例
1、演示 lock 的使用
Thread/Lock/LockDemo.xaml

<Page x:Class="XamlDemo.Thread.Lock.LockDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:XamlDemo.Thread.Lock" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable

Thread/Lock/LockDemo.xaml.cs

/* * 演示 lock 的使用 * * 注:lock 其实就是对 Monitor.Enter() 和 Monitor.Exit() 的一个封装 */ using System.Collections.Generic; using System.Threading.Tasks; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace XamlDemo.Thread.Lock { LockDemo : Page { _objLock = new object(); _countWithoutLock; _countWithLock; public LockDemo() { this.InitializeComponent(); } OnNavigatedTo(NavigationEventArgs e) { List<Task> tasks = new List<Task>(); (int i = 0; i < 100; i++) { Task task = Task.Run( () => { { (_objLock) { for (int j = 0; j < 100000; j++) { _countWithLock++; } } } finally { } (int j = 0; j < 100000; j++) { _countWithoutLock++; } }); tasks.Add(task); } Task.WhenAll(tasks); lblMsgWithoutLock.Text = + _countWithoutLock.ToString(); lblMsgWithLock.Text = + _countWithLock.ToString(); } } }


2、演示 Monitor 的使用
Thread/Lock/MonitorDemo.xaml

<Page x:Class="XamlDemo.Thread.Lock.MonitorDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:XamlDemo.Thread.Lock" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable

Thread/Lock/MonitorDemo.xaml.cs

/* * 演示 Monitor 的使用 * * 本例说明: * 由于 Task 基于线程池,所以 task1 和 task2 的启动顺序是不一定的,以下步骤假定 task1 先执行,task2 后执行 * 1、task1 取得排它锁 * 2、task1 Monitor.Wait() - 释放排它锁,然后 task1 进入等待队列,可以为其指定一个超时时间,超过则进入就绪队列 * 3、task2 取得排它锁 * 4、task2 Monitor.Pulse() - 让等待队列中的一个线程进入就绪队列(Monitor.PulseAll() 的作用是将等待队列中的全部线程全部放入就绪队列) * 5、task1 进入就绪队列 * 6、task2 Monitor.Wait() - 释放排它锁,然后 task2 进入等待队列 * 7、task1 取得排它锁 * 8、以上步骤不断往复 * * 注: * 1、Wait() 和 Pulse() 必须在 Enter() 和 Exit() 之间,或者在 lock(){ } 中 * 2、只有就绪队列中的线程才能取得排它锁,等待队列中的线程是无法取得排它锁的 */ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace XamlDemo.Thread.Lock { MonitorDemo : Page { _objLock = new object(); public MonitorDemo() { this.InitializeComponent(); } OnNavigatedTo(NavigationEventArgs e) { string result = ""; flag = true; Task task1 = Task.Run( () => { try { // 在指定的对象上取得排它锁 Monitor.Enter(_objLock); for (int i = 0; i < 10; i++) { if (flag) Monitor.Wait(_objLock); flag = true; result += , i, Task.CurrentId); result += Environment.NewLine; Monitor.Pulse(_objLock); } } finally { // 在指定的对象上释放排它锁 Monitor.Exit(_objLock); } }); Task task2 = Task.Run( () => { try { // 在指定的对象上取得排它锁 Monitor.Enter(_objLock); for (int i = 0; i < 10; i++) { if (!flag) Monitor.Wait(_objLock); flag = false; result += , i, Task.CurrentId); result += Environment.NewLine; Monitor.Pulse(_objLock); } } finally { // 在指定的对象上释放排它锁 Monitor.Exit(_objLock); } }); await Task.WhenAll(task1, task2); lblMsg.Text = result; } } }


3、演示 Interlocked 的使用
Thread/Lock/InterlockedDemo.xaml

网友评论
<