Welcome

首页 / 软件开发 / .NET编程技术 / Windows 8 Store Apps学习(48) 多线程之其他辅助类

Windows 8 Store Apps学习(48) 多线程之其他辅助类2013-12-10 cnblogs webabcd多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute

介绍

重新想象 Windows 8 Store Apps 之 多线程操作的其 他辅助类

SpinWait - 自旋等待

SpinLock - 自旋锁

volatile - 必在内存

SynchronizationContext - 在指定的线程上同步数 据

CoreDispatcher - 调度器,用于线程同步

ThreadLocal - 用于保存每 个线程自己的数据

ThreadStaticAttribute - 所指定的静态变量对每个线程都是唯一的

示例

1、演示 SpinWait 的使用

Thread/Other/SpinWaitDemo.xaml.cs

/* * SpinWait - 自旋等待,一个低级别的同步类型。它不会放弃任何 cpu 时间,而是让 cpu 不停的循环等待 ** 适用场景:多核 cpu ,预期等待时间非常短(几微秒) * 本例只是用于描述 SpinWait 的用法,而不代表适用场景 */using System;using System.Threading;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Navigation;namespace XamlDemo.Thread.Other{public sealed partial class SpinWaitDemo : Page{public SpinWaitDemo(){this.InitializeComponent();}protected override void OnNavigatedTo(NavigationEventArgs e){lblMsg.Text = DateTime.Now.ToString("mm:ss.fff");SpinWait.SpinUntil(() =>// 以下条件成立时,结束等待{return false;}// 如果此超时时间过后指定的条件还未成立,则强制结束等待,1000);lblMsg.Text += Environment.NewLine;lblMsg.Text += DateTime.Now.ToString("mm:ss.fff");SpinWait.SpinUntil(() => // 以下条件成立时,结束等待{return DateTime.Now.Second % 2 == 0;});lblMsg.Text += Environment.NewLine;lblMsg.Text += DateTime.Now.ToString("mm:ss.fff");}}}
2、演示 SpinLock 的使用

Thread/Other/SpinLockDemo.xaml.cs

/* * SpinLock - 自旋锁,一个低级别的互斥锁。它不会放弃任何 cpu 时间,而是让 cpu 不停的循环等待,直至锁变为可用为止 ** 适用场景:多核 cpu ,预期等待时间非常短(几微秒) * 本例只是用于描述 SpinLock 的用法,而不代表适用场景 */using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Navigation;namespace XamlDemo.Thread.Other{public sealed partial class SpinLockDemo : Page{private static int _count;public SpinLockDemo(){this.InitializeComponent();}protected async override void OnNavigatedTo(NavigationEventArgs e){SpinLock spinLock = new SpinLock();List<Task> tasks = new List<Task>();// 一共 100 个任务并行执行,每个任务均累加同一个静态变量 100000 次,以模拟并发访问静态变量的场景for (int i = 0; i < 100; i++){Task task = Task.Run(() =>{bool lockTaken = false;try{// IsHeld - 锁当前是否已由任何线程占用// IsHeldByCurrentThread - 锁是否由当前线程占用// 要获取 IsHeldByCurrentThread 属性,则IsThreadOwnerTrackingEnabled 必须为 true,可以在构造函数中指定,默认就是 true// 进入锁,lockTaken - 是否已获取到锁spinLock.Enter(ref lockTaken);for (int j = 0; j < 100000; j++){_count++;}}finally{// 释放锁if (lockTaken)spinLock.Exit();}});tasks.Add(task);}// 等待所有任务执行完毕await Task.WhenAll(tasks);lblMsg.Text = "count: " + _count.ToString();}}}