首页 > 其他分享 >dotnet 测试 Mutex 的 WaitOne 是否保持进入等待的顺序先进先出

dotnet 测试 Mutex 的 WaitOne 是否保持进入等待的顺序先进先出

时间:2024-09-12 08:53:01浏览次数:1  
标签:origin git var mutex dotnet Mutex 先进先出 WaitOne

本文记录我测试 dotnet 里面的 Mutex 锁,在多线程进入 WaitOne 等待时,进行释放锁时,获取锁执行权限的顺序是否与进入 WaitOne 等待的顺序相同。测试的结果是 Mutex 的 WaitOne 是乱序的,不应该依赖 Mutex 的 WaitOne 做排队顺序

以下是测试程序代码

var taskList = new List<Task>();
var mutex = new Mutex(false);
var locker = new object();
mutex.WaitOne();

var autoResetEvent = new AutoResetEvent(false);

for (int i = 0; i < 100; i++)
{
    var n = i;
    taskList.Add(Task.Run(() =>
    {
        autoResetEvent.Set();

        mutex.WaitOne();

        lock (locker)
        {
            Console.WriteLine(n);
        }

        mutex.ReleaseMutex();
    }));

    autoResetEvent.WaitOne();
}

mutex.ReleaseMutex();
Task.WaitAll(taskList.ToArray());

运行之后输出是乱序。证明 Mutex 的 WaitOne 没有保证获取锁出来的顺序是按照进入的顺序的,没有保证先进先出

本文以上代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin c255d512b09862d291b1a5a3fb921689b0b04a58

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin c255d512b09862d291b1a5a3fb921689b0b04a58

获取代码之后,进入 RijallcijiDuqewerbu 文件夹

标签:origin,git,var,mutex,dotnet,Mutex,先进先出,WaitOne
From: https://www.cnblogs.com/lindexi/p/18000483

相关文章

  • Packaging.DebUOS 专门为 dotnet 应用制作 UOS 安装包
    Packaging.DebUOS是我所在的团队开发开源的一款专门用在为dotnet的应用制作成为符合要求的UOS统信系统软件安装包的工具,此工具可以辅助开发者使用现有的工具链经过简单的配置即可完成安装包的制作设计思想Packaging.DebUOS旨在通过使用csproj项目文件等方式进行配置,避免......
  • Dotnetty学习笔记——自定义初始化处理器
    常常我们需要开一个服务单,对接不同的客户端,编码器、解码器等都不同,需要针对不同IP添加不同的处理器。publicclassCustomInitializer:Channellnitializer<lSocketChannel>{Action<string,string>_dealMsgAction;lServer_server;publicCustomInitializer(Action<st......
  • # dotnet如何设置restore package path,依赖和项目放在一起
    dotnet如何设置restorepackagepath,依赖和项目放在一起配置说明再.csproj中添加如下配置,然后dotnetrestore,可以依赖包放到和项目一起,从而方便移动到没有网络的电脑上执行<RestorePackagesPath>../packages</RestorePackagesPath>所需的依赖包就会复制一份到本地,如下......
  • C++学习随笔——lock_guard和mutex的使用方法
    std::mutex和std::lock_guard是C++标准库中用于多线程同步的工具,主要用于防止多个线程同时访问共享资源,导致数据竞争问题。 std::mutex是一个用于互斥锁的类,提供了锁定(lock)和解锁(unlock)的功能。使用方法:#include<iostream>#include<thread>#include<mutex>std::......
  • golang mutex原理
    最近面试遇到问锁的问题,答得不是很好,重新做一下总结梳理 go中的sync包提供了两种锁的类型,分别是互斥锁sync.Mutex和读写锁sync.RWMutex,这两种锁都属于悲观锁饥饿模式与正常模式在下面的内容会经常涉及到一个概念,饥饿模式,这里先简单说一下1.正常模式(非公平锁)正常模式下,所......
  • Go 互斥锁 Mutex 源码分析(二)
    原创文章,欢迎转载,转载请注明出处,谢谢。0.前言在Go互斥锁Mutex源码分析(一)一文中分析了互斥锁的结构和基本的抢占互斥锁的场景。在学习锁的过程中,看的不少文章是基于锁的状态解释的,个人经验来看,从锁的状态出发容易陷入细节,了解锁的状态转换过一段时间就忘,难以做到真正的......
  • dotnet 默认创建的 JsonContent 没有 Content Length 的内容头
    本文记录一个dotnet的设计问题,默认创建出来的JsonContent对象的Headers里,是没有Content-Length信息的如下面代码创建一个JsonContent对象usingSystem.Net.Http.Json;varfoo=newFoo();varjsonContent=JsonContent.Create(foo);classFoo{publicin......
  • dotnet X11 多次调用 XPutImage 是否能做到渲染同步
    本文将告诉大家我在麒麟系统和统信系统以及分别搭配飞腾和兆芯处理器的设备上,使用连续的XPutImage方法推送界面,测试是否能够在一次渲染内完成。测试结论是不能做到渲染同步本文的核心测试代码如下XPutImage(display,handle,gc,refxImage,@event.ExposeEvent.x,@......
  • dotnet C# 结构体出方法弹栈之后的行为
    本文记录我在.NET9里测试的行为,在方法里面创建的在栈上的结构体,在方法执行结束之后,栈上的结构体将会被弹栈进入不受管理区域,此时的结构体内存内容不会立刻被清空或被改写这是我在对dotnetX11栈空间被回收导致调用XPutShmImage闪退博客的内容进行更多的测试,确保和X11没......
  • Go 互斥锁 Mutex 源码分析 (一)
    原创文章,欢迎转载,转载请注明出处,谢谢。0.前言锁作为并发编程中的关键一环,是应该要深入掌握的。1.锁1.1示例实现锁很简单,示例如下:varglobalintfuncmain(){ varmusync.Mutex varwgsync.WaitGroup fori:=0;i<2;i++{ wg.Add(1) gofunc(iint){......