Tag: mutex

如何实现MVC 4 Web App服务器端互斥锁

我不是MVC专家,但我相信这是可行的; 但是,我不知道如何在MVC 4中做到这一点。 对于测试,我使用的是使用VS 2012创建网站时提供的默认Web应用程序。 为简单起见,考虑HomeController.Index()被多个用户完全同时命中(例如3)。 我想执行一个互斥的方法,因为一次只执行一个; 因此迫使他们连续。 我不在乎什么顺序。 我知道有关阻止页面的警告,并且所有内容都应该是异步的,但为此我需要阻止很短的时间。 public class HomeController : Controller { private String dosomething() { String str; str = “SomeValue”; //<– Will vary return str; } public ActionResult Index() { String str; // How do I do implement the following, preferably with a timeout to be safe Lock(dosomething); str = […]

exception抛出后,Boost共享互斥锁未释放

我在预先存在的.NET(C#,3.5)应用程序中遇到了一个奇怪的Boost(v1.38)互斥锁死锁,该应用程序调用C ++库。 在获得读取锁定之后的某个时刻[正确]抛出一个exception,并且该exception一直未处理回托管.NET代码(处理它的位置)。 尝试使用setter方法的c ++库的下一次调用会无限期地挂起唯一的锁定获取(可能是未释放读取锁定): ntdll.dll!NtWaitForSingleObject() + 0x15 bytes kernel32.dll!WaitForSingleObjectEx() + 0x43 bytes kernel32.dll!WaitForSingleObject() + 0x12 bytes OurCPPLib.dll!boost::shared_mutex::unlock_upgrade_and_lock() Line 478 + 0x11 bytes C++ OurCPPLib.dll!boost::unique_lock::unique_lock(boost::detail::thread_move_t<boost::upgrade_lock > other) Line 788 C++ OurCPPLib.dll!boost::upgrade_to_unique_lock::upgrade_to_unique_lock(boost::upgrade_lock & m_) Line 802 + 0x98 bytes C++ OurCPPLib.dll!OurClass::SetSomething(double something) Line 95 C++ 该类定义了许多Get和Set方法(读者/编写者)并像这样实现它们: boost::shared_mutex _calcSharedMutex; RETURNCODE GetSomething(double& something) { boost::shared_lock lock(_calcSharedMutex); return _anotherObject->GetSomething(something); […]

如果您不能命名,互斥锁有什么用?

我很难在没有命名的情况下搞清楚互斥锁的优点。 具体来说,我想让我的Windows Mobile 6.5应用程序单实例。 在这个网站上有一些关于如何做到这一点的问题和答案 – 最好的问题和答案似乎使用了命名的互斥体。 不幸的是,紧凑框架中的互斥体的CTORS不需要字符串 – 只能创建一个互斥锁。 现在,如果没有关联的ID,互斥量有什么用呢? 我错过了什么吗? 如果我无法命名,我如何使用互斥锁来保护多个应用程序中的资源?

检测应用程序的另一个实例是否已在运行

如果已经有实例运行,我的应用程序在加载时需要表现得略有不同。 我理解如何使用互斥锁来防止其他实例加载,但这并不能完全解决我的问题。 例如: 实例1加载,获取互斥锁。 实例2加载,无法获取互斥锁,知道还有另一个实例。 到现在为止还挺好。 实例1关闭,释放互斥锁。 实例3加载,获取互斥锁,不知道实例2仍在运行。 有任何想法吗? 值得庆幸的是,它不需要处理多个用户帐户或类似的东西。 (C#,桌面应用程序) 编辑:为了澄清,应用程序不需要限制为单个实例,只是在已经运行另一个实例时执行稍微不同的启动操作。 多个实例都很好(并且是预期的)。

单实例窗口形成应用程序以及如何获取它的参考?

我有一个Windows窗体应用程序,当时只允许一个实例运行。 我已经使用Mutex实现了Singleton。 应用程序必须可以从命令行启动(带或不带参数)。 应用程序由脚本启动和退出。 用户不能对其采取任何行动。 因此,应用程序的目的是简单的“指标”应用程序,它将只为最终用户显示一些视觉和图形信息。 最终用户无法对其进行任何操作,只需查看即可。 它是Windows窗体应用程序,因为视觉和图形外观是相对容易的实现(你可以得到它最顶层,无边框等)。 简单地说:当有人试图用退出命令行参数运行相同的应用程序时,如何退出当前运行的应用程序? bool quit = (args.Length > 0 && args[0] == “quit”) ? true : false; using (Mutex mutex = new Mutex(false, sExeName)) { if (!mutex.WaitOne(0, true)) { if (quit) { // This is the tricky part? // How can I get reference to “previous” launced // Windows […]

我怎样才能摆脱废弃的互斥体?

摘要: 有没有办法清除互斥锁,如果创建它的过程已经死了又消失了? 细节: 我使用互斥锁来确保我的应用只运行一个实例。 在测试一些新代码(进行自动更新)时,我运行了Environment.Exit(0)。 在调试模式下运行时,我的互斥锁被清理干净了。 但是当我将构建更改为“Release”时,互斥体会在退出调用后保持不变并被标记为已放弃: 我已经进行了双重检查,以确保没有一个进程仍在运行,这个互斥锁被连接到了。 现在每次运行我的应用程序时,它都认为互斥锁仍然存在,并且不会启动我的应用程序。 (它也崩溃了,因为它试图向应用程序的“当前运行”实例发送消息以显示自己。) 我试图像这样释放互斥锁: bool createdNew; string applicationId = “18773:TestStudio”; var singleInstanceMutex = new Mutex(true, applicationId, out createdNew); singleInstanceMutex.Close(); // Tried ReleaseMutex() too 但当然只是得到它然后释放它。 我知道我可以重新启动,但我正在寻求一个更好的解决方案,以防生产中发生这种情况。 有没有办法清除互斥锁,如果创建它的过程已经死了又消失了?

C# – 如何获取互斥锁的所有者名称

我在两个应用程序之间有一个共享的互斥锁。 我想创建一个管理控制台,显示当前所有者的互斥锁名称。 如何获取当前拥有Mutex的应用程序名称?

如何优雅地摆脱AbandonedMutexException?

我使用以下代码来同步多个正在运行的进程之间对共享资源的互斥访问。 互斥锁是这样创建的: Mutex mtx = new Mutex(false, “MyNamedMutexName”); 然后我用这个方法进入互斥部分: public bool enterMutuallyExclusiveSection() { //RETURN: ‘true’ if entered OK, // can continue with mutually exclusive section bool bRes; try { bRes = mtx.WaitOne(); } catch (AbandonedMutexException) { //Abandoned mutex, how to handle it? //bRes = ? } catch { //Some other error bRes = false; } […]

我应该处理Mutex吗?

我正在开发2个Windows服务,它有一个公共数据库,我想用系统Mutex锁定(交叉处理)。 现在我想知道在try-finally块中调用WaitOne()和ReleaseMutex() ,或者我是否也应该using Mutex(例如在using块中)。 如果是这样我想我应该总是在WaitOne()方法上捕获AbandonedMutexException ,或者我错在这里?

如何实现每台机器应用程序的单实例?

我必须限制我的.net 4 WPF应用程序,以便每台计算机只能运行一次。 请注意,我说每台机器,而不是每个会话。 到目前为止,我使用简单的互斥锁实现了单实例应用程序,但不幸的是,每个会话都有这样的互斥锁。 有没有办法创建一个机器范围的互斥体,还是有任何其他解决方案来实现每个机器应用程序的单个实例?