Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk melaksanakan corak mutex global yang mantap di C#?

Bagaimana untuk melaksanakan corak mutex global yang mantap di C#?

Patricia Arquette
Patricia Arquetteasal
2025-01-30 22:12:13366semak imbas

How to Implement Robust Global Mutex Patterns in C#?

c#Kesedaran yang boleh dipercayai dari mod badan bersama Global

Kelas Mutex dalam C#menyediakan mekanisme untuk mengawal akses kepada pelbagai benang atau proses perkongsian sumber. Badan bersama bersama global mempunyai skop sistematik, dan telah mencadangkan cabaran unik dalam memastikan penggunaan yang selamat dan boleh dipercayai. Artikel ini membincangkan model komprehensif untuk mewujudkan dan berkesan penggunaan expecket bersama global, dan menyelesaikan aspek utama kemerdekaan penetapan serantau, pelepasan pemecatan bersama yang betul, dan memproses keadaan yang tidak normal.

Pelaksanaan mod

Contoh kod berikut menunjukkan mod yang boleh dipercayai menggunakan badan bersama global:

Ciri -ciri Utama

<code class="language-csharp">using System.Runtime.InteropServices;   //GuidAttribute
using System.Reflection;                //Assembly
using System.Threading;                 //Mutex
using System.Security.AccessControl;    //MutexAccessRule
using System.Security.Principal;        //SecurityIdentifier

// ...

// 主应用程序逻辑
static void Main(string[] args)
{
    // 获取应用程序的唯一GUID
    string appGuid =
        ((GuidAttribute)Assembly.GetExecutingAssembly()
            .GetCustomAttributes(typeof(GuidAttribute), false)
                .GetValue(0)).Value.ToString();

    // 创建全局唯一的互斥体ID
    string mutexId = string.Format( "Global\{{{0}}}", appGuid );

    // 为多用户使用建立安全设置
    var allowEveryoneRule =
        new MutexAccessRule( new SecurityIdentifier( WellKnownSidType.WorldSid
                                                   , null)
                           , MutexRights.FullControl
                           , AccessControlType.Allow
                           );
    var securitySettings = new MutexSecurity();
    securitySettings.AddAccessRule(allowEveryoneRule);

    // 使用指定的ID和安全设置初始化互斥体
    using (var mutex = new Mutex(false, mutexId, out bool createdNew, securitySettings))
    {
        // 尝试获取互斥体句柄,设置超时
        var hasMutexHandle = false;
        try
        {
            hasMutexHandle = mutex.WaitOne(5000, false);
        }
        catch (AbandonedMutexException)
        {
            // 记录日志并获取被放弃的互斥体
            hasMutexHandle = true;
        }

        // 在互斥体范围内执行关键操作
        if (hasMutexHandle)
        {
            // ...
            mutex.ReleaseMutex();
        }
    }
}</code>

Kemerdekaan tetapan serantau: ID bersama menggunakan generasi GUID aplikasi untuk memastikan ia unik di kawasan yang berbeza.

    Pastikan penyebaran bersama dikeluarkan:
  • Menggunakan blok secara automatik melepaskan badan yang saling eksklusif apabila melebihi julat, menghapuskan risiko badan bersama yang digantung. pemprosesan masa keluar:
  • Tentukan masa lampau pilihan apabila mendapatkan badan yang saling eksklusif untuk mengelakkan menunggu tanpa had.
  • Rawatan yang saling eksklusif yang ditinggalkan: elegan untuk mendapatkan badan bersama yang ditinggalkan untuk memastikan pelaksanaan program tidak akan disekat selama -lamanya.
  • Multi -User Security: Pengecualian bersama untuk memberikan keizinan akses yang jelas kepada semua pengguna, yang membolehkan kerjasama dan perkongsian sumber.
  • Kesimpulan
  • Model ini menyediakan asas yang kukuh untuk penggunaan badan bersama global di C#untuk memastikan pelaksanaan yang selamat dan boleh dipercayai. Dengan mengikuti kriteria ini, pemaju dapat menguruskan sumber perkongsian secara berkesan dan mencegah isu -isu yang berpotensi yang berkaitan dengan penggunaan alternatif bersama.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan corak mutex global yang mantap di C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn