关于c#中数据的原子操作及让人郁闷的InterLocked类

2024-03-28 00:48

本文主要是介绍关于c#中数据的原子操作及让人郁闷的InterLocked类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先,查书看了一下原子操作的概念,自己编了一程序试了一下,果然,在C#中除了int型的赋值支持原子操作,其他的应该都需要同步锁定。

测试代码如下:

 

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Threading;

namespace  Test2
{
    
class Program2
    
{
        
static void Main(string[] args)
        
{
            Thread thread1 
= new Thread(new ThreadStart(ThreadFunction1));
            Thread thread2 
= new Thread(new ThreadStart(ThreadFunction2));

            thread1.IsBackground 
= true;
            thread2.IsBackground 
= true;

            thread1.Start();
            thread2.Start();

            Console.ReadLine();
        }


        
static long value = value1;
        
const long value1 = 0x1111111100000000;
        
const long value2 = 0x0000000011111111;

        
//static int value = 0;
        
//const int value1 = 0x11110000;
        
//const int value2 = 0x00001111;
        
        
static void ThreadFunction1()
        
{
            Console.WriteLine(
"Thread1 Start ...");
            
            
while(true)
            
{
                
if (value == value1)
                    value 
= value2;
                    
//Interlocked.Exchange(ref value, value2);
                else
                    value 
= value1;
                    
//Interlocked.Exchange(ref value, value1);
            }

        }


        
static void ThreadFunction2()
        
{
            Console.WriteLine(
"Thread2 Start ...");
            
//int bValue = 0;
            long bValue = 0;
            
while (true)
            
{
                
//bValue = Interlocked.Read(ref value);
                bValue = value;
                
if (bValue != value1 && bValue != value2)
                
{
                    Console.WriteLine(
"Error");
                }

            }

        }

    }

}

 不过让人郁闷的是微软的System.Threading.InterLocked类,本来想用它替换Lock方法的,但测了一下其性能,发现对long型的操作竟然比lock还要慢,倒。。。

 

using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Test2
{
    
class Program
    
{
        
const long  COUNT = 100000000;
        
static long  count = COUNT;
        
static long  var = 0;
        
static object obj = new object();   // lock锁

        
static void Main(string[] args)
        
{
            
long start = 0;
            start 
= System.DateTime.Now.Ticks;
            
while (count-- > 0)
            
{
                
lock (obj)
                
{
                    var
++;
                }

            }

            
long duration = System.DateTime.Now.Ticks - start;
            Console.WriteLine(duration);

            start 
= System.DateTime.Now.Ticks;
            var 
= 0;
            count 
= COUNT;
            
while (count-- > 0)
            
{
                System.Threading.Interlocked.Increment(
ref var);
            }


            duration 
= System.DateTime.Now.Ticks - start;
            Console.WriteLine(duration);


        }

    }

}

下面是测试结果:

28750000

33437500

汗。。。不知道微软怎么处理的。因为在对int型的测试中,InterLocked比lock要快一个数量级呢。。。

这篇关于关于c#中数据的原子操作及让人郁闷的InterLocked类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853938

相关文章

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程