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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET