`
izuoyan
  • 浏览: 8946513 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

c#线程基础之原子操作

阅读更多

使用System.Threading.Interlocked类可以提高线程的安全性,具体资料参考msdn: http://msdn.microsoft.com/zh-cn/library/system.threading.interlocked.aspx 一般情况下,在子线程内使用i++这样的方式访问全局变量的方式是不安全的做法。测试下面的代码,在test1中经过100次number++,number并没有每次从0变为100,而test2则没有问题。

using System;

using System.Windows.Forms;

namespace WindowsApplication32

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        int number = 0;



        /// <summary>

        /// 普通的变量访问方式

        /// </summary>

        private void test1()

        {

            for (int m = 0; m < 10; m++)

            {

                number++;

                System.Threading.Thread.Sleep(100);

            }

            Console.WriteLine(number);

        }

        private void button1_Click(object sender, EventArgs e)

        {

            number = 0;

            for (int i = 0; i < 10; i++)

            {

                new System.Threading.Thread(test1).Start();

            }

        }

        /// <summary>

        /// 使用原子的访问方式

        /// </summary>

        private void test2()

        {

            for (int m = 0; m < 10; m++)

            {

                System.Threading.Interlocked.Increment(ref number);

                System.Threading.Thread.Sleep(100);

            }

            Console.WriteLine(number);

        }

        private void button2_Click(object sender, EventArgs e)

        {

            number = 0;

            for (int i = 0; i < 10; i++)

            {

                new System.Threading.Thread(test2).Start();

            }

        }

    }

}

分享到:
评论

相关推荐

    C#线程锁介绍源码

    1.几种同步方法的区别 lock和Monitor是.NET用一个特殊结构实现的,Monitor...这在抢先多线程操作系统中是很重要的,在这样的操作系统中,线程可以在从某个内存地址加载值之后但是在有机会更改 和存储该值之前被挂起。

    c# 线程(thread)同步处理

    .NET平台上的线程同步的问题线程之间共享的变量访问的同步,它的操作时原子操作,且被线程共享.你可以通过Interlocked.Increment 或 Interlocked.Decrement来增加或减少共享变量.它的有点在于是原子操作,也就是说...

    C#多线程编程中的锁系统(二)

    主要介绍了C#多线程编程中的锁系统(二),本文讲解了volatile、Interlocked、ReaderWriterLockSlim等升级锁和原子操作的使用实例,需要的朋友可以参考下

    c#.net多线程编程教学——线程同步

    随着对多线程学习的深入,你可能觉得需要了解一些有关线程共享资源的问题. .NET framework提供了很多的类和数据类型来控制对共享资源的访问。 考虑一种我们经常遇到的情况:有一些全局变量和共享的类变量,我们需要...

    多线程CPU压力测试源码

    源码调用了精易模块,。注意!老电脑一定要不要勾选不延迟!...本程序用于测试计算CPU在多线程下同时计算对CPU产生的压力!。没有做防护!如果需要做防炸机在第二个时钟下写代码!。本程序原理十分简单!。@氢原子。

    C#多线程编程中的锁系统(四):自旋锁

    目录 一:基础 二:自旋锁示例 三:SpinLock 四:继续SpinLock 五:总结 一:基础 内核锁:基于内核对象构造的锁机制,就是通常说的内核构造模式...自旋锁:原子操作+自循环。通常说的用户构造模式。 线程不休眠,一直

    C#中实现线程同步lock关键字的用法详解

    如果需要对它们进行互斥访问限制,可以使用System.Threading.Interlocked类提供的方法,这个类是提供原子操作的。 3. lock(this)的使用要慎重。共有类型中使用lock(this),如果新的对象被创建并加锁,极易造成死锁。

    java,c/c++,php,c#安全编码规范

    2.6 多线程编程 23 2.6.1 确保共享变量的可见性 23 2.6.2 确保共享变量的操作是原子的 24 2.6.3 不要调用Thread.run(),不要使用Thread.stop()以终止线程 26 2.6.4 确保执行阻塞操作的线程可以终止 26 2.6.5 ...

    FastAtomicLazy:更快,更少泄漏的线程安全惰性在C#中的实现

    快速原子懒惰C#中更快,更少泄漏的线程安全Lazy 实现。基本原理是延迟实例化类型的出色通用实现。 但是,对于同时满足以下两个条件的情况,这是不合适的: 您在并发上下文中使用Lazy在该上下文中可能同时发生多个...

    ffplay自定义播放器封装C#接口

    * v1.3.13 Windows,全局初始化添加原子操作 * v1.3.14 Windows渲染采用d3d9,去除音频滤镜,音频倍速切换为soundtouch实现,不再限制0.5-2倍速范围。 * v1.3.15 ACPixelFormat的值与AVPixelFormat统一,可以直接使用...

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第2部分)

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第3部分)

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    C# 线程同步的方法

    一、进程内部的线程同步 1、使用lock,用法如下: ...2、使用:InterLocked(原子操作) 其在System.Threading命名空间下,Interlocked实际是类控制计数器,从而实现进程的同步,其很容易实现生产者消费

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第一部分)

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    如何利用Redis分布式锁实现控制并发操作

    注:redis的命令都是原子操作 SETNX key value 将 key 的值设为 value ,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 可用...

    Silverlight2.0功能展示Demo源码

    Silverlight 2.0 使用Thread, Timer, BackgroundWorker, ThreadPool来实现多线程开发。 Thread - 用于线程的创建和控制的类 Timer - 用于以指定的时间间隔执行指定的方法的类 BackgroundWorker - 用于在单独的线程上...

    解决C#程序只允许运行一个实例的几种方法详解

    要实现程序的互斥,通常有下面几种方式,下面用 C# 语言来实现:方法一:使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.把program.cs文件里的Main()函数改为如下代码: 代码如下:using System;using System....

    .NET之美:.NET关键技术深入分析

    目录 第一部分C#语言基础 第1章C#类型基础 1.1值类型和引用类型 1.1.1值类型 1.1.2引用类型 1.1.3简单类型 1.1.4装箱和拆箱 1.2对象判等 1.2.1 引用类型判等 ...第16章 多线程 第17章 对象生存期与垃圾收集

    ILGPU:用于高性能.Net GPU程序的ILGPU JIT编译器

    使用集成的多线程CPU加速器,可以在CPU上执行和调试所有内核(包括共享硬件和原子等所有硬件功能)。制作说明ILGPU需要Visual Studio 2019(社区版或更高版本)。 使用提供的Visual Studio解决方案以所需的配置...

Global site tag (gtag.js) - Google Analytics