zoukankan      html  css  js  c++  java
  • 第二章 管理程序流(In .net4.5) 之 管理多线程

    1. 概述

      本章包括同步资源以及取消长时间任务相关的内容。

    2. 主要内容

      2.1 同步资源

        ① lock关键字实现。会阻塞程序,有可能会导致死锁。

        ② volatile关键字可以禁用编译优化,用于避免优化代码时对多线程的影响。

    private static volatile int _flag = 0;

        ③ Interlocked关键字可以原子化一些简单数字运算和比较替换操作。

    Interlocked.Increment(ref n); //
    Interlocked.Decrement(ref n); //
    Interlocked.Exchange(ref isInUse, 1);
    Interlocked.CompareExchange(ref value, newValue, compareTo);

      2.2 取消任务

        ① CancellationToken

    CancellationTokenSource cancellationTokenSource = 
        new CancellationTokenSource(); 
    CancellationToken token = cancellationTokenSource.Token; 
    
    Task task = Task.Run(() => 
    {
        while(!token.IsCancellationRequested)
        {
            Console.Write("*");
            Thread.Sleep(1000);
        }
    }, token);
    
    Console.WriteLine("Please enter to stop the task");
    Console.ReadLine();
    cancellationTokenSource.Cancel();

        ② 使用Task.WaitAny()可以设置任务的超时时间。

    Task longRunning = Task.Run(() =>
    {
        Thread.Sleep(10000);
    });
    
    int index = Task.WaitAny(new[] {longRunning}, 1000);
    
    if (index == -1)
        Console.WriteLine("Task time out ");

    3. 总结

      ① 多线程环境访问共享数据时,要考虑避免数据的损坏和脏读。

      ② 使用lock关键字可以实现共享资源的多线程顺序访问。

      ③ 可以使用Interlocked实现简单的原子操作。

      ④ 可以使用CancellationTokenSource类的CancellationToken来控制取消任务。

  • 相关阅读:
    list切片
    class面向对象编程学习笔记
    斐波那契数
    module学习笔记
    Python基础
    产品经理培训行业---以起点学院为主体的相关竞品分析报告
    基础数据结构-二叉树-赫夫曼树的构建与编码
    大众点评APP分析随笔
    滴滴拼车功能分析
    梅沙教育APP简单分析-版本:iOS v1.2.21-Nathaneko-佳钦
  • 原文地址:https://www.cnblogs.com/stone_lv/p/4347587.html
Copyright © 2011-2022 走看看