c#线程基础之原子操作

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

01.using System;02.03.using System.Windows.Forms;04.05.namespace WindowsApplication3206.07.{08.09.    public partial class Form1 : Form10.11.    {12.13.        public Form1()14.15.        {16.17.            InitializeComponent();18.19.        }20.21.        int number = 0;22.23.24.25.        /// <summary>26.27.        /// 普通的变量访问方式28.29.        /// </summary>30.31.        private void test1()32.33.        {34.35.            for (int m = 0; m < 10; m++)36.37.            {38.39.                number++;40.41.                System.Threading.Thread.Sleep(100);42.43.            }44.45.            Console.WriteLine(number);46.47.        }48.49.        private void button1_Click(object sender, EventArgs e)50.51.        {52.53.            number = 0;54.55.            for (int i = 0; i < 10; i++)56.57.            {58.59.                new System.Threading.Thread(test1).Start();60.61.            }62.63.        }64.65.        /// <summary>66.67.        /// 使用原子的访问方式68.69.        /// </summary>70.71.        private void test2()72.73.        {74.75.            for (int m = 0; m < 10; m++)76.77.            {78.79.                System.Threading.Interlocked.Increment(ref number);80.81.                System.Threading.Thread.Sleep(100);82.83.            }84.85.            Console.WriteLine(number);86.87.        }88.89.        private void button2_Click(object sender, EventArgs e)90.91.        {92.93.            number = 0;94.95.            for (int i = 0; i < 10; i++)96.97.            {98.99.                new System.Threading.Thread(test2).Start();100.101.            }102.103.        }104.105.    }106.107.}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索线程
, private
, number
, system
, interlocked
, 方式
threading
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-07-29 21:47:31

c#线程基础之原子操作的相关文章

Android多线程研究(1) 线程基础及源码剖析

从今天起我们来看一下Android中的多线程的知识,Android入门容易,但是要完成一个完善的产品却不容易,让我们从线程开始一步步深入Android内部. 一.线程基础回顾 package com.maso.test; public class TraditionalThread { public static void main(String[] args) { /* * 线程的第一种创建方式 */ Thread thread1 = new Thread(){ @Override publi

线程基础(第二部分)Java线程的缺陷和副作用几解决办法

<--在线程基础的第二部分中,我们将了解一下使用Java线程的缺陷和副作用,以及在SUN JDK 1.2中是如何修改线程的运行机制的--> 在上篇文章<Java 101之线程基础>中,我们介绍了线程的概念以及如何使用线程.这个月,我们将转到更高级的话题,包括线程的缺陷及副作用,以及在SUN JDK 1.2中,是如何改进线程的运行机制的. synchronize(同步) 让我们回忆一下上篇文章中讲的:线程允许两个或者更多个进程同时执行.实际上,这些线程也可以共享对象和数据,在这种情形

java线程编程(一):线程基础

在学习java中,我发现有关于对线程的讲解比较少,我打算为一些java初学者提一些关于线程方面的参考, 为深入学习java奠定基础.我本着共同进步的原则特写下了关于java线程编程的一系列文章 java线程编程(一):线程基础 ◆线程(thread)其实是控制线程(thread of control)的缩写. 每一个线程都是独立的,因此线程中的每个方法的局部变量都是和其他线程隔离开的,这些变量完全是私有的,因此对于 线程而言,是没有办法访问其他线程的局部变量的.如果两个线程同时访问同一个方法,则

Linux 系统应用编程——线程基础

 传统多任务操作系统中一个可以独立调度的任务(或称之为顺序执行流)是一个进程.每个程序加载到内存后只可以唯一地对应创建一个顺序执行流,即传统意义的进程.每个进程的全部系统资源是私有的,如虚拟地址空间,文件描述符和信号处理等等.使用多进程实现多任务应用时存在如下问题: 1)任务切换,即进程间上下文切换,系统开销比较大.(虚拟地址空间以及task_struct 都需要切换) 2)多任务之间的协作比较麻烦,涉及进程间通讯.(因为不同的进程工作在不同的地址空间) 所以,为了提高系统的性能,许多操作系统规

Qt之线程基础

何为线程 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据计算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例子:一个进程运行电子表格程序:另一个进程运行一个媒体播放器.这种情况最适合用多任务这个词来描述.进一步观察媒体播放器,你会发现在这个进程内,又存在并行的工作.当媒体播放器向音频驱动发送音乐数据的时候,用户界面上与之相关的信息不断地进行更新.这就是单个进程内的并行线程. 那么,并发是如何实现的呢?在单

[CLR via C#]25. 线程基础

原文:[CLR via C#]25. 线程基础 一.Windows为什么要支持线程 Microsoft设计OS内核时,他们决定在一个进程(process)中运行应用程序的每个实例.进程不过是应用程序的一个实例要使用的资源的一个集合.每个进程都赋予了一个虚拟地址空间,确保一个进程使用的代码和数据无法由另一个进行访问.这样就确保了应用程序集的健壮性,因为一个进程无法破坏另一个进程里的数据和代码.另外,进程是无法访问到OS的内核代码和数据. 如果一个应用程序进入死循环时,如果只是单核的CPU的,它会无

线程基础之遗漏和扩展部分

  这里我们只是关注了一些多线程之间共享变量的简单使用问题.这些是任何一个写多线程程序的人,都应该熟悉的最基础的问题.我们忽略了一些其他多线程实现提供的工具.它们虽然很少被用到,但是对于你的程序仍然很有必要. 其他锁类型 大多数环境提供可重入锁,即被一个单线程多次持有,比如java synchronized 块就有这种锁的特性行为.通常读写锁也提供这个功能,即一个锁可以同时被多个"读"线程持有,但只能同时被一个"写"线程持有. 条件变量等 对于一个线程等待某个特殊条

线程基础之JAVA和C++0x的特性

译文连接   译文地址  译者:衣着时   校对:丁一    (有兴趣参与试译或校对的同学,请加入并发网试译者QQ群:369468545) JAVA特性 JAVA线程通常是一个带有run()方法的java.lang.Thread的子类,然后调用这个子类对象的start()方法.我们之前定义过,数据竞争是因为两个线程同时访问内存单元,在JAVA中,内存单元是一个对象字段或数组元素. 由于JAVA旨在支持运行不受信任代码作为受信任的应用程序的一部分,必须限制不受信任代码的数据争用造成的破坏.因此不允

c#线程基础之线程控制

用ManualResetEvent和AutoResetEvent可以很好的控制线程的运行和线程之间的通信.msdn的参考为: http://msdn.microsoft.com/zh-cn/library/system.threading.autoresetevent.aspx http://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent.aspx 下面我写个例子,这里模拟了一个线程更新数据,两个线程读取数据.