问题标签 [mutual-exclusion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 请求互斥记录
我正在使用 C# 处理两种类型的应用程序。一种是 Web 服务,一种是 MVC3 应用程序。
我对两者都有同样的问题。我正在尝试创建一个方法,当请求时,它会返回一个分布式节点的记录来处理。
并发问题导致这很危险。一旦进程“A”请求处理记录。如果进程“B”在数据库检查“A”的记录之前请求一个,它们可能都得到相同的记录,这对该系统不利。
在网络服务中,我有一个名为“GetRecordToProcess”的网络方法。在一个控制器中也有一个对应的 MVC3 ActionResult 做同样的事情。
注意 Web 服务和 MVC 操作不需要相互排斥。他们实际上是在两个不同的表上工作,但我碰巧在两个不同的项目上遇到了同样的问题。
我有一个使用 Mutex 的工作版本,但是当我调用 Mutex.WaitOne 这是 baaaad 时,这些进程正在运行我的 CPU 几乎 60%。有什么简单的方法可以做到这一点吗?这似乎很明显,这将是一个常见的分布式计算需求,我只是不知道常见的解决方案。
algorithm - Peterson-2 互斥算法
经典Peterson-2 算法的无争用复杂度为4(因为它对共享寄存器内存执行 4 次读/写操作)是否存在 Peterson-2 算法的某个版本,它需要较少访问共享寄存器内存?很明显,1 次访问是不可能的。但是 2 次或 3 次访问呢?谢谢
c# - 如何像 lock 语句中那样实现互斥,但是如果块被锁定则会被跳过?
使用lock 语句,可以“确保一个线程不进入代码的临界区,而另一个线程处于临界区。如果另一个线程试图进入锁定的代码,它将等待、阻塞,直到对象被释放。”
如果我想要的行为是,如果另一个线程尝试进入锁定的代码,它会跳过整个代码(而不是等待锁被释放)怎么办?我想到的一个想法是使用标志,例如
但我知道这是不安全的,因为两个线程可以在任何人设置为 true 之前通过第一行,或者在异常情况下标志永远不会设置为 false。你能提出改进或替代方案吗?
concurrency - 监视器和互斥
只是想知道监视器中的互斥是在过程/方法级别还是在监视器级别。
我的意思是,在第一种情况下,可能有 2 个线程访问监视器,但它们将在不同的过程中运行。在第二种情况下,即使调用了两个不同的过程,也不会有 2 个线程加入监视器。
假设它处于监视器级别,它似乎更安全。但是,是否存在这样的情况:监视器中可能运行 2 个不同的线程,每个线程都修改不同的共享变量,而监视器不允许这种情况发生?如果是这样的话,这不会降低系统的并发性吗?或者这是否意味着应该创建 2 个监视器而不是一个?
好的,我最好完成哲学化:)提前谢谢
java - 从主线程共享对象和控制线程执行
我正在尝试解决非常简单的问题。我有一个主线程,它绘制一个框架和另一个线程(FrameThread),每次都准备这个框架。两个线程应该共享相同的 MyFrame 对象。我想从主线程控制 FrameThread,即:MyFrame 已准备好 -> 在主线程中绘制它 -> 保持 FrameThread 运行。目前我做了以下工作:
之后我创建FrameThread:
最后是主线程:
所以我的目标是:FrameThread 在后台执行并在帧准备好后立即停止。我是 Java 的新手,我觉得有更好、更安全的方法来实现它。你能给我一个建议吗?谢谢你。
email - ASP.net + C#.net 中的互斥访问
目前我面临一个经过大量工作和搜索后无法解决的问题,我之前问过一个类似的问题但没有得到任何答复,可能是因为我没有正确询问所以我删除了那个问题。
好的,我正在使用 MailBEE.net 对象库下载电子邮件,它工作正常,除了如果在先前的调用仍处于下载阶段时再次调用下载方法,则开始下载两个消息副本,这是错误的。
在 ASP.net 页面上,我正在调用下载电子邮件的 ASHX 处理程序
我正在使用来自另一个(ASPX)页面的 Jquery 调用上述 ASHX 处理程序
目的是在一段时间后(20000延迟)继续调用sync.ashx以检查新消息,问题是如果一个sync.ashx调用忙于下载消息并且在此期间进行了新调用,它会启动下载相同的消息副本,因为它没有在数据库中找到先前调用将进行的电子邮件的 ID。
我需要某种互斥访问,如果有一次通话正忙于下载消息,则不应再拨打另一个电话。
就像是
其中 IsAlreadyDownloading 是一个全局标志或互斥锁,一旦一个调用开始下载,就应该设置为 True,一旦完成下载或发生某些异常,表明可以安全地进行另一个调用,就应该设置为 false。
由于它是一个 ASP.net 应用程序,我们不知道用户何时会离开开始下载调用的页面以及何时会导航回该页面,因此是否应该再次调用下载处理程序。
我不知道我是否解释得当,但我希望有人能理解。谢谢你。
c++ - 在 C++11 中处理互斥
我有一个代表有限状态机的类,它应该在一个永远循环中运行并检查它的当前状态。在每个状态机将设置它的下一个状态,要么进入idle
状态,要么做一些工作。我想允许另一个线程在它工作时改变机器的状态。正如预期的那样,这将导致竞争条件。所以我添加了一个互斥锁/解锁机器的包装循环和允许其他线程改变机器当前状态的公共方法。
执行:
以及允许其他线程改变当前状态的 move 方法:
我无法找到我做错了什么!move()
程序在函数的第一行崩溃。另一方面,GDB 不适用于 C++11,并且无法跟踪代码......
更新:
玩弄代码,我可以看到问题出在移动功能上。当程序尝试将代码块锁定在内部move()
时,会崩溃。例如,如果移动是这样的:
输出是:
但是 whenmove
是一个简单的函数,什么都不做:
程序同时运行。
android - 如何确保android库项目代码仅在集成它的已安装应用程序之一中执行?
我正在开发一个库项目,它将集成到一些流行的 android 应用程序中,这些应用程序可以在 Google Play 中看到。
假设用户可以安装两个或多个应用程序,并且每个应用程序都可以集成我的库。该库有一些特定的代码用于检测环境状态的变化。状态只是发送到我的服务器。问题是环境状态处理会占用大量 CPU 资源,但时间很短。处理周期由 AlarmManager 启动,使用启动适当 IntentService 的“非唤醒”广播。
我的目标是以这种方式实现库,只有一个集成到应用程序中的实例才能完成这项工作。我的意思是只有一个库模块应该充当“活动”。如果用户设备上安装了更多应用程序 - 那么它们不应该重叠。
如何实现?我正在考虑某种权限验证和跨包检测,但无法想象如何实现它。
c++ - C++ 手工制作的互斥锁
我为我的项目制作了一个手工制作的互斥锁,但我怀疑它是否是线程安全的......
可以说,线程 A 通过了 while 循环并且没有及时阻塞标志(没有时间将标志设置为false
),线程 B 也通过了 while 循环!
可能吗?为什么?
据我了解,互斥锁具有完全相同的工作原理。为什么这不能发生在互斥体中?我读过关于不能被中断的原子操作......所以
check-if-mutex-available
和mutex-block
不能被中断,对吧?