1
4
正如您可能发现的,没有公开成员
也没有公共本机函数: http://msdn.microsoft.com/en-us/library/ms686360%28v=VS.85%29.aspx
但是,有一些未记录/不支持的功能,特别是在
所以,答案是:使用传统方法是不可能的。 |
2
13
没有干净的方法可以做到这一点的原因是因为这不是一个好主意,原因是当你依赖于这种逻辑时,比赛条件很容易引入。所以你的设计需要改变。 首先,不应获取构造函数中的锁。将这个类转换为一个返回正确初始化的互斥对象的工厂。这样你就能知道你是否拿到了锁。 不要依靠释放锁来释放锁,这是要求死锁的代码很难维护。使用try/finally块确保释放它。 超时有点粗略。只有在不获取锁时才使用超时将被视为正常操作。无法获取锁通常是一个bug,而仅仅通过超时来避免它就隐藏了这个bug。如果需要超时,请考虑使用事件(可能是autoreseteevent),这可能更合适。 |
3
2
为什么你不能用
编辑 我在猜测其中的一些。 似乎您正在尝试开发一个API。您在API中提供的项目之一是进程间锁。 我假设您正在跨线程共享一个集合,并且您使用互斥来确保一次只对它执行一个操作。
我会重新考虑这个设计。如果我从来没有包过呢
会有一个废弃的互斥体 从 MSDN
如果你试图保护你的用户,你可能想通过控制他们的互斥来帮助他们,这样他们就不用担心了。 一个可能的例子是
这是一种可能的方法。这完全取决于目标是什么。由于互斥体是操作系统构造,所以我不会中继最终用户来调用Dispose。如果名称不是非静态的,它可能会影响使用相同互斥名称的其他进程。 |
4
1
好吧,这不是你想要的,但我认为它可以解决你的问题:为什么不专门为互斥被其他人捕获时发生的异常添加一些错误处理呢?
|
5
1
这不会对问题的原始海报有好处,但这里是。 虽然我不反对其他关于正确使用互斥体的海报,但是我有一个应用程序,我需要在那里测试某人是否拥有互斥体而不占用自己的所有权。正如其他人提到的,唯一的方法是使用来自ntdll.dll的未记录的ntqueryvariant系统调用。我为mutex类创建了一个扩展方法,可以这样使用:
下面是实现
|
6
0
.NET mutex类是本机mutex包装器,它提供与本机mutex API相同的可能性(除了等待不同类型的可等待对象的数量)。如果要在不阻塞的情况下获取互斥体,请调用mutex.waitone(0)。使用pinvoke,可以使用相同的结果调用WaitForSingleObject。 |
7
0
如果你真的想做一个进程间锁,顾名思义,你需要一种方法来检测互斥锁是否真的被获取了,对吗?我不确定您的代码如何使用
我自己也实现了同样的事情(因为我更喜欢使用块,而不是尝试最终释放互斥体),而是在超时时抛出异常,如果我正确记住项目,则不会调用Dispose方法。
编辑:
在构造函数中引发异常的额外好处是:还完全避免了关键部分,并且可以在
经过进一步的思考,而不是使用
感觉有点讽刺
|
da cheng · 在c++11中使用条件变量使程序陷入死锁 6 年前 |
Eunjeong Choi · 为什么此代码返回意外结果?(条件变量) 6 年前 |
Razonixx · 从线程内增加全局计数器变量,而不必等待每个线程 6 年前 |
Administrator · c#-等待完成2个线程中的1个 6 年前 |
Francis Cugler · 删除Windows库依赖项 6 年前 |
AshR · 程序断断续续地使用main报告与线程本身不同的线程id 7 年前 |
user7256215 · 在macOS内核扩展中有效地使用同步 7 年前 |