关于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

相关文章

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语