如何使互斥体不递归
我运行了下面的代码,期望在第二次锁定互斥体时锁定流程。运行两次后,我意识到它可以多次锁定(假设在同一个线程中)而不停止。我该如何改变这种行为?
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Test {
class Program {
static volatile Mutex mut1 = new Mutex();
static volatile Mutex mut2 = new Mutex();
static void Main(string[] args) {
mut1.WaitOne(); Console.WriteLine("1W");
mut2.WaitOne(); Console.WriteLine("2W");
Thread oThread = new Thread(new ThreadStart(fn2));
oThread.Start();
mut1.WaitOne(); Console.WriteLine("1W");
Console.WriteLine("Second");
mut1.ReleaseMutex(); Console.WriteLine("1R");
}
static void fn2() {
Console.WriteLine("First");
mut2.ReleaseMutex(); Console.WriteLine("2R");
mut1.ReleaseMutex(); Console.WriteLine("1R");
}
}
}
I ran the code below expecting flow to be locked on the 2nd time I lock a mutex. After running it twice I realize it can lock many times (assuming in the same thread) without stopping. How do I change this behavior?
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Test {
class Program {
static volatile Mutex mut1 = new Mutex();
static volatile Mutex mut2 = new Mutex();
static void Main(string[] args) {
mut1.WaitOne(); Console.WriteLine("1W");
mut2.WaitOne(); Console.WriteLine("2W");
Thread oThread = new Thread(new ThreadStart(fn2));
oThread.Start();
mut1.WaitOne(); Console.WriteLine("1W");
Console.WriteLine("Second");
mut1.ReleaseMutex(); Console.WriteLine("1R");
}
static void fn2() {
Console.WriteLine("First");
mut2.ReleaseMutex(); Console.WriteLine("2R");
mut1.ReleaseMutex(); Console.WriteLine("1R");
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,我不确定您是否真的了解互斥体,您只能在它们最初被锁定的上下文(即线程)中释放它们,因此将它们用作某种保护点没有什么意义。
在此使用 信号量 可能更有意义案件。但你仍然应该弄清楚你真正想做的是什么:)
For a start I am not sure you really understand mutexes, you can only release them in the context (i.e. thread) in which they were locked to begin with, so using them as some sort of guard points makes little sense.
It might make more sense to use semaphores in this case. But you still should work out what you are really trying to do :)