Windows 8 Store Apps学习(47) 多线程之线程同步: Semaphore等

多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent

介绍

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

Semaphore - 信号量

CountdownEvent - 通过信号数量实现线程同步

Barrier - 屏障

ManualResetEvent - 手动红绿灯

AutoResetEvent - 自动红绿灯

示例

1、演示 Semaphore 的使用

Thread/Lock/SemaphoreDemo.xaml

<Page
    x:Class="XamlDemo.Thread.Lock.SemaphoreDemo"
    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="lblMsg" FontSize="14.667" />

        </StackPanel>
    </Grid>
</Page>

Thread/Lock/SemaphoreDemo.xaml.cs

/*
 * 演示 Semaphore 的使用
 *
 * Semaphore - 信号量
 * SemaphoreSlim - 轻量级的 Semaphore
 *
 * 注:
 * 直译 Semaphore 的话不太好理解,可以将 Semaphore 理解为一个许可证中心,该许可证中心的许可证数量是有限的
 * 线程想要执行就要先从许可证中心获取一个许可证(如果许可证中心的许可证已经发完了,那就等着,等着其它线程归还许可证),执行完了再还回去
 */

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
{
    public sealed partial class SemaphoreDemo : Page
    {
        /*
         * Semaphore(int initialCount, int maximumCount, string name)
         *     initialCount - 许可证中心初始拥有的许可证数量,即初始情况下已经发出的许可证数量为maximumCount - initialCount
         *     maximumCount - 许可证中心总共拥有的许可证数量
         *     name - 许可证中心的名称
         * Semaphore OpenExisting(string name) - 打开指定名称的许可证中心
         */

        // 实例化一个许可证中心,该中心拥有的许可证数量为 2 个
        private Semaphore _semaphore = new Semaphore(2, 2);

        public SemaphoreDemo()
        {
            this.InitializeComponent();
        }

        protected async override void OnNavigatedTo(NavigationEventArgs e)
        {
            List<Task> tasks = new List<Task>();

            // 模拟 5 个线程并行执行,拿到许可证的线程才能运行,而许可证中心只有 2 个许可证
            for (int i = 0; i < 5; i++)
            {
                CancellationToken token = new CancellationTokenSource().Token;

                Task task = Task.Run(
                    () =>
                    {
                        OutMsg(string.Format("task {0} 等待一个许可证", Task.CurrentId));
                        token.WaitHandle.WaitOne(5000);

                        // WaitOne() - 申请许可证
                        _semaphore.WaitOne();
                        OutMsg(string.Format("task {0} 申请到一个许可证", Task.CurrentId));

                        token.WaitHandle.WaitOne(1000);

                        OutMsg(string.Format("task {0} 归还了一个许可证", Task.CurrentId));
                        // int Release() - 归还许可证,返回值为:Release() 之前许可证中心可用的许可证数量
                        int ignored = _semaphore.Release();
                        // int Release(int releaseCount) - 指定释放的信号量的次数(按本文的理解就是指定归还的许可证数量)
                    },
                    token);

                tasks.Add(task);
            }

            await Task.WhenAll(tasks);
        }

        private void OutMsg(string msg)
        {
            var ignored = Dispatcher.RunAsync(
                Windows.UI.Core.CoreDispatcherPriority.High,
                () =>
                {
                    lblMsg.Text += msg;
                    lblMsg.Text += Environment.NewLine;
                });
        }
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索红绿灯识别
, string
, 线程
, 许可证
, 信号量
, semaphore
数量
,以便于您获取更多的相关知识。

时间: 2024-09-30 10:35:36

Windows 8 Store Apps学习(47) 多线程之线程同步: Semaphore等的相关文章

Windows 8 Store Apps学习(46) 多线程之线程同步: Lock等

多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock 介绍 重新想象 Windows 8 Store Apps 之 线程同步 lock - 其实就是对 Monitor.Enter() 和 Monitor.Exit() 的一个封装 Monitor - 锁 Interlocked - 为多个线程共享的数字型变量提供原子操作 Mutex - 互斥锁,主要用于同一系统内跨进程的互斥锁 ReaderWriterLock - 读写锁 示例

Windows 8 Store Apps学习(42) 多线程之线程池

多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 介绍 重新想象 Windows 8 Store Apps 之 线程池 通过 ThreadPoolTimer 实现延迟执行 通过 ThreadPoolTimer 实现周期执行 通过 ThreadPool 实现"在线程池中找一个线程去执行指定的方 法" 示例 1.通过 ThreadPoolTimer 实现延迟执行(ThreadPoolTimer 在 Windows.System.Threading 命名空间下)

重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent

原文:重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent [源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent 作者:webabcd 介绍重新想

Windows 8 Store Apps学习(43) 多线程之任务

多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel) 介绍 重新想象 Windows 8 Store Apps 之 任务 Task - 基于线程池的任务(在 System.Threading.Tasks 命名空间下) 多 Task 的并行执行 Parallel - 并行计算(在 System.Threading.Tasks 命名空间下) 示例 1.演示 Task(基于线程池的任务)的基本应用 Thread/Tasks/TaskDemo.xaml <Page x:Cla

Windows 8 Store Apps学习(48) 多线程之其他辅助类

多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute 介绍 重新想象 Windows 8 Store Apps 之 多线程操作的其 他辅助类 SpinWait - 自旋等待 SpinLock - 自旋锁 volatile - 必在内存 SynchronizationContext - 在指定的线程上同步数 据 CoreD

Windows 8 Store Apps学习(45) 多线程之异步编程: IAsyncAction

多线程之异步编程: IAsyncAction, IAsyncOperation 重新想象 Windows 8 Store Apps (45) - 多线程之异步编程: IAsyncAction, IAsyncOperation, IAsyncActionWithProgress, IAsyncOperationWithProgress 介绍 重新想象 Windows 8 Store Apps 之 异步编程 IAsyncAction - 无返回值,无进度值 IAsyncOperation - 有返回

Windows 8 Store Apps学习(44) 多线程之异步编程

多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换 介绍 重新想象 Windows 8 Store Apps 之 异步编程 经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例 1.使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类 Thread/Async/ClassicAsync.cs /*

Windows 8 Store Apps学习(41) 打印

介绍 重新想象 Windows 8 Store Apps 之 打印 示例 1.需要打印的文档 Print/PrintPage.xaml <Page x:Class="XamlDemo.Print.PrintPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xam

Windows 8 Store Apps学习(21) 动画: ThemeTransition(过渡效果)

介绍 重新想象 Windows 8 Store Apps 之 动画 ThemeTransition 的概述 EntranceThemeTransition - 页面间跳转时的过渡效果 ContentThemeTransition - 内容改变时的过渡效果 RepositionThemeTransition - 位置改变时的过渡效果 PopupThemeTransition - 弹出时的过渡效果 AddDeleteThemeTransition - 添加项或删除项时的过渡效果 ReorderThe