Welcome

首页 / 软件开发 / .NET编程技术 / Windows 8 Store Apps学习(46) 多线程之线程同步: Lock等

Windows 8 Store Apps学习(46) 多线程之线程同步: Lock等2013-12-10 cnblogs webabcd多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

介绍

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

lock - 其实就是对 Monitor.Enter() 和 Monitor.Exit() 的一个封装

Monitor - 锁

Interlocked - 为多个线程共享的数字型变量提供原子操作

Mutex - 互斥锁,主要用于同一系统内跨进程的互斥锁

ReaderWriterLock - 读写锁

示例

1、演示 lock 的使用

Thread/Lock/LockDemo.xaml

<Pagex: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="d"><Grid Background="Transparent"><StackPanel Margin="120 0 0 0"><TextBlock Name="lblMsgWithoutLock" FontSize="14.667" /><TextBlock Name="lblMsgWithLock" FontSize="14.667" /></StackPanel></Grid></Page>
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{public sealed partial class LockDemo : Page{// 需要被 lock 的对象private static readonly object _objLock = new object();private static int _countWithoutLock;private static int _countWithLock;public LockDemo(){this.InitializeComponent();}protected async override void OnNavigatedTo(NavigationEventArgs e){List<Task> tasks = new List<Task>();// 一共 100 个任务并行执行,每个任务均累加同一个静态变量 100000 次,以模拟并发访问静态变量的场景for (int i = 0; i < 100; i++){Task task = Task.Run(() =>{/******************有锁的逻辑开始******************/try{// 通过 lock 锁住指定的对象以取得排它锁,在 lock 区域内的代码执行完毕后释放排它锁,排它锁释放之前其它进入到此的线程会排队等候lock (_objLock){for (int j = 0; j < 100000; j++){_countWithLock++;}}}finally { }/******************有锁的逻辑结束******************//******************没锁的逻辑开始******************/for (int j = 0; j < 100000; j++){_countWithoutLock++;}/******************没锁的逻辑结束******************/});tasks.Add(task);}// 等待所有任务执行完毕await Task.WhenAll(tasks);lblMsgWithoutLock.Text = "计数器(不带锁)结果:" + _countWithoutLock.ToString();lblMsgWithLock.Text = "计数器(带锁)结果:" + _countWithLock.ToString();}}}