zoukankan      html  css  js  c++  java
  • Linux下的Mutex

    C#互斥锁Mutex在Windows平台能够用于进程间同步,使用它来进行单例检测比较合适。但是在Linux环境下,无论是Mono还是.NetCore(3.1)中都不能够用于进程间同步。

    1、测试代码 

    using System;
    using System.Globalization;
    
    namespace Sample
    {
        class Program
        {
            static void Main(string[] args)
            {
                bool createNew;
                var mutex = new System.Threading.Mutex(true, "Sample123456789", out createNew);
                Console.WriteLine(!createNew
                    ? DateTime.Now.ToString(CultureInfo.InvariantCulture) + " - Mutex Sample123456789 exists."
                    : DateTime.Now.ToString(CultureInfo.InvariantCulture) + " - Create Mutex Sample123456789: " +
                      mutex.SafeWaitHandle.DangerousGetHandle() + ".");
                mutex = new System.Threading.Mutex(true, "Sample123456789", out createNew);
                Console.WriteLine(!createNew
                    ? DateTime.Now.ToString(CultureInfo.InvariantCulture) + " - Mutex Sample123456789 exists."
                    : DateTime.Now.ToString(CultureInfo.InvariantCulture) + " - Create Mutex Sample123456789: " +
                      mutex.SafeWaitHandle.DangerousGetHandle() + ".");
                Console.WriteLine("Press any key to continue.");
                Console.ReadKey();
                Console.WriteLine("Goodbye.");
                Console.ReadKey();
            }
        }
    }

     2、在Ubuntu 18.04中运行.netcore app

    (1) 运行一个dotnet TestConsole.dll,然后通过FlashFXP查看tmp文件夹,如下图所示

    (2) 再运行一个dotnet TestConsole.dll,然后通过FlashFXP查看tmp文件夹,如下图所示

    (3) 结论

    在netcore进程中创建一个Mutex对象,会在tmp文件夹中创建基于进程的读写管道,多个进程的读写管道互不影响。其中的文件dotnet-diagnostic-2655-60423137-socket,是用于netcore诊断的socket。

    3、在Ubuntu 18.04中运行mono

    (1) 编译.Program.cs

    mono-csc Program.cs

    (2) 运行Program.exe

    mono Program.exe

    (3) 运行结果

    在Xshell中对同一台机器开启2个连接,运行2次Program.exe,结果如下

    (4) 结论

    在Mono中使用Mutex也无法达到进程间同步的效果。经过搜索StackOverflow,发现如下事实:

    Mono does not support any Windows-native IPC. So you do not have for example Named Pipes, or Mutexes.

    4、总结

    在Ubuntu 18.04环境下,无论是Mono还是.NetCore(3.1)都不能使用Mutex进行进程间同步,但是可以考虑使用特定文件读写或者socket实现。

  • 相关阅读:
    Leetcode: Longest Absolute File Path
    Leetcode: Mini Parser
    Leetcode: First Unique Character in a String
    Leetcode: Lexicographical Numbers
    Leetcode: Shuffle an Array
    Leetcode: Ransom Note
    Leetcode: Linked List Random Node
    Socket网络编程--聊天程序(7)
    Socket网络编程--聊天程序(6)
    Socket网络编程--聊天程序(5)
  • 原文地址:https://www.cnblogs.com/xhubobo/p/14605339.html
Copyright © 2011-2022 走看看