在C#编程中,我们可以使用Mutex类来在两个线程之间进行同步。它的工作原理类似于锁。它可以阻止两个线程同时执行一个或多个行为。Mutex在许多进程中工作。它给出了WaitOne()和ReleaseMutex()方法。WaitOne()方法用于锁定资源,而ReleaseMutex()方法则用于解锁资源。当我们在处理一个多框架项目或一个创建了多个任务的项目时,它很有用。当我们试图锁定其他任务或线程,而其他任务或线程正在使用该资源时,不能使用该资源时,我们应该使用这个方法。
在本指南中,我们将向你解释我们如何在C#编程中使用Mutex类。我们提供了在C#程序中使用Mutex()类的不同例子。我们在Ubuntu 20.04中执行了这些例子。
例子#1
我们将执行一个使用Mutex()类的例子。由于我们使用Ubuntu 20.04来执行这些例子,我们必须打开Ubuntu 20.04的文本编辑器,然后用我们选择的任何名字创建一个文件,并以".cs "为文件扩展名保存该文件。然后在这个文件中输入以下代码。我们还将在下面详细解释这个给定程序的每一行。

这段C#代码的第一行是 "using System",这是一个库,通过使用这个库,我们可以得到C#代码的不同类和功能。通过使用这个库,我们得到了 "Console "类和 "WriteLine "函数。关键词 "using "是用来接收参数的。"System.线程 "在这里用于生成任务和接收来自类的对象。现在,我们将导入名字为 "DemoMutex "的命名空间。我们还创建了一个名为 "Program "的类。我们创建一个名为 "mutex "的实例,它等于 "new Mutex()"。new "是一个创建新实例的关键字。
然后在我们的C#代码中调用 "main "函数。在这个 "main "函数中,我们有一个 "for "循环,用于创建五个不同的线程。由于这个循环将 "a "初始化为 "1",这里的条件是 "a<=5",这意味着循环中有5次迭代,或者循环迭代5次并创建多个线程。当循环执行且条件为真时,每次 "a "的值都会增加。然后,我们通过使用 "new "关键字创建一个名为 "threadObj "的线程对象。当这个循环执行时,它会创建一个Thread对象。现在,我们给 "threadobj "起一个 "名字",等于 "a "的值。它将存储名称为 "Thread "+a,表示 "Thread "和 "a "的值,"a "取决于循环迭代的值。
然后我们有 "threadObj.Start()",其中 "Start() "用于将 "threadObj "的状态改为运行状态。在这个 "for "循环之外,我们有 "Console.ReadKey()"。这将用于等待一个按键。在这个方法下面有一个名为 "DemoMutex "的方法,是 "静态 "的。我们用这个方法来实现使用 "Mutex "的同步。Console.WriteLine "在这里用于打印写在里面的语句。在这个 "Console.WriteLine "语句之后,我们将使用 "try "方法。
然后,我们又有了 "Console.WriteLine "语句。当你看到输出时,你就会明白这个 "Console.WriteLine "是如何打印给定语句的。Thread.Sleep(2000) "是用来暂停或中止当前线程的执行,其时间是作为一个参数给出的。在这之后,我们再次使用 "Console.WriteLine "语句。我们使用关键字 "keyword "来清理我们在try块中分配的资源,或者在try语句离开控制时在这个 "final "块中执行的语句。在 "finally "语句里面,我们将调用 "ReleaseMutex "方法,该方法用于解除阻塞,以便另一个线程开始执行试图执行的内容。
我们还在下面的图片中给出了这段代码的输出。你可以看到这段代码是如何在屏幕上给出输出的。我们用这个命令编译我们的代码,当代码没有错误时,它将为我们创建一个exe文件。然后通过使用 "mono "命令来执行这个 "exe "文件。记住,当我们使用这个 "mono "命令时,我们必须在文件名中使用".exe "文件扩展名,然后运行这个命令来获得输出。

在这个输出中,你可以看到,当一个线程想进入关键部分时,其他线程也想进入,但它们必须等到第一个线程完成执行,因为我们使用了Mutex "WaitOne() "函数。当这个线程完成执行后,下一个线程进入并开始执行,在完成任务后存在。它允许下一个线程进入并开始执行。同样的步骤重复进行,直到条件为真。
例子#2
这里,我们有另一个使用Mutex()方法的例子。让我们试试这个例子来理解这个概念。

在这段C#代码中使用的相同语句是 "using System "和 "System.Threading"。这个类是 "MutexProgram",在这个类中,我们通过使用 "new "关键字创建了一个名称为 "mutex "的Mutex类的实例,然后在这下面调用 "main "函数。WaitOne()方法试图获得一个锁。如果mutex不可用,那么 "WaitOne() "就会阻塞并等待,直到它可用。我们还在这里指定了一个时间限制。如果我们在 "Mutex对象 "上调用WaitOne()方法,并且时限已过而无法获得Mutex,那么WaitOne返回false。当它返回false时,下面写的语句将被执行:"Console.WriteLine "语句。而这个语句是用来打印的。
如果我们得到true,我们就会去执行的代码部分,也就是 "Run() "函数,这个函数定义如下。当 "Run() "结束时,然后执行 "finally "块,它使用 "MutexRelease "释放突变体。我们在前面的代码中解释了这个 "MutexRelease"。我们在这里定义了 "Run() "函数,其中我们将使用 "Console.WriteLine() "来打印一条语句,最后,我们有 "Console.ReadLine()"。这个 "Console.ReadLine "是用来读取完整的字符串的,直到按下回车键。

输出只显示 "Run() "语句,因为它返回真,并移到 "Run()"。如果我们同时在另一个终端上执行,那么在另一个终端上,将显示写在if语句里面的语句,因为它试图获得 "Mutex",但 "Mutex "已经被另一个应用程序使用,所以它必须等待 "Mutex "释放。
总结
本教程探讨了C#编程中的 "Mutex"。我们在这里演示了两个例子,并使用这个 "Mutex",以便你理解这个概念。这个 "Mutex "类将为我们提供 "WaitOne()"和 "RealeaseMutex()"函数。这个 "WaitOne() "用于锁定,而 "ReleaseMutex() "则用于解锁任务或线程。我们在例子中使用了这两个方法,并详细解释了所有这些。我希望你在彻底学习了本指南后能学会 "Mutex "的概念,并能在你的项目中使用这个 "Mutex "类。