问题标签 [mutex]

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.

0 投票
7 回答
66410 浏览

javascript - javascript中是否需要互斥锁?

我看过这个链接:在 JavaScript 中实现互斥。另一方面,我读到 javascript 中没有线程,但这到底是什么意思?

当事件发生时,它们可以在代码中的什么位置中断?

如果JS中没有线程,我是否需要在JS中使用互斥锁?

具体来说,我想知道使用setTimeout()and调用XmlHttpRequest的函数onreadystatechange对全局可访问变量的影响。

0 投票
2 回答
1170 浏览

multithreading - 如何使用 Win32 API 实现类 java 同步(监视器)?

每个 Java 对象(及其类)都有一个关联的监视器。在 pthread 术语中,Java 监视器等同于可重入互斥锁和条件变量的组合。

对于锁定,Win32 API 提供 Mutex 对象(可重入但重量级)和关键部分(不可重入但轻量级)。它还提供了其他同步结构,例如信号量和事件,但没有明确的条件变量概念。

如果我正在编写一个 JVM,我如何使用这些 Win32 概念来实现 Java 监视器?

0 投票
2 回答
1509 浏览

php - PHP 5.x 同步文件访问(无数据库)

我最熟悉 Java、C 和 C++,其中有一些方法可以控制在任何给定时间只有一个线程正在访问资源。现在我正在寻找类似的东西,但在 PHP 5.x 中。

用一个例子来阐述我的问题:

我有一个 ASCII 文件,它只存储一个数字,即页面加载计数器的值。在应用程序部署时,该文件将简单地保存一个 0。对于每次访问,该值将增加 1。目标是跟踪页面加载。

当许多用户同时访问包含计数器的页面时,就会出现问题。当线程 A 读取当前值时,假设它是 11,我们称为 B 的另一个线程读取该值,仍然是 11。然后第一个线程 A 增加读取的值并将 12 写入文件并关闭它。然后第二个线程 B 增加读取的值,即 11,获取 12 并将其写入文件。值 12 存储在文件中,而实际上它应该是 13。

在另一种编程语言中,我会使用互斥锁来解决这个问题。我知道作为模块的一部分,有互斥锁、共享内存和其他功能。但我想要一个适用于“大多数服务器”的解决方案。独立于平台。安装在最便宜的网络主机上。这个问题有好的解决方案吗?如果没有,如果不能选择使用数据库,您会采取哪种方式?

0 投票
8 回答
124591 浏览

multithreading - 递归锁(互斥锁)与非递归锁(互斥锁)

POSIX 允许互斥体是递归的。这意味着同一个线程可以两次锁定同一个互斥体并且不会死锁。当然也需要解锁两次,否则其他线程无法获得互斥量。并非所有支持 pthread 的系统也支持递归互斥锁,但如果它们想要符合 POSIX 标准,它们必须.

其他 API(更高级的 API)通常也提供互斥锁,通常称为锁。一些系统/语言(例如 Cocoa Objective-C)同时提供递归和非递归互斥锁。有些语言也只提供一种或另一种。例如,在 Java 中,互斥锁总是递归的(同一个线程可能在同一个对象上“同步”两次)。根据它们提供的其他线程功能,没有递归互斥锁可能没有问题,因为它们可以很容易地自己编写(我已经在更简单的互斥锁/条件操作的基础上自己实现了递归互斥锁)。

我不太明白:非递归互斥锁有什么用?如果它两次锁定同一个互斥锁,为什么我会想要一个线程死锁?即使是可以避免这种情况的高级语言(例如测试这是否会死锁并抛出异常)通常也不会这样做。他们会让线程死锁。

这仅适用于我不小心将其锁定两次并且仅将其解锁一次的情况,并且在递归互斥锁的情况下,将更难找到问题,因此我立即将其死锁以查看不正确的锁定出现在哪里?但是我不能在解锁时返回一个锁计数器做同样的事情吗?在我确定我释放了最后一个锁并且计数器不为零的情况下,我可以抛出异常或记录问题吗?还是我没有看到其他更有用的非递归互斥锁用例?或者它可能只是性能,因为非递归互斥体可能比递归互斥体稍微快一点?但是,我对此进行了测试,差异确实没有那么大。

0 投票
4 回答
9642 浏览

windows - 为什么 WaitForSingleObject 会返回 WAIT_FAILED

MSDN 说

如果函数失败,则返回值为 WAIT_FAILED。要获取扩展错误信息,请调用 GetLastError。

代码是:

但是可能发生的原因是什么?

0 投票
5 回答
11499 浏览

c++ - 在多线程 C++ 应用程序中,我是否需要互斥锁来保护简单的布尔值?

我有一个多线程 C++ 应用程序,它使用 OpenSceneGraph 库进行 3D 渲染。我计划使用 boost::threads 将 OSG 的渲染循环作为一个单独的线程启动,将包含共享状态的数据结构传递给线程。我试图避免任何过于重量级的东西(如互斥锁)进行同步,因为渲染循环需要非常紧凑,而 OSG 本身试图避免必须锁定。大多数共享状态是在线程启动之前设置的,并且永远不会改变。我确实有一些需要更改的数据,我计划对其进行双重缓冲。但是,我有一个简单的布尔值,用于指示线程暂停渲染,然后恢复渲染,以及另一个来终止它。在这两种情况下,应用程序线程都会设置布尔值,而渲染线程只读取它。我需要同步对这些布尔值的访问吗?据我所知,可能发生的更糟糕的事情是渲染循环在暂停或退出之前继续进行额外的帧。

0 投票
7 回答
123695 浏览

c# - 在 C# 中使用全局互斥锁的好模式是什么?

Mutex 类很容易被误解,全局互斥体更是如此。

创建全局互斥体时使用什么好的、安全的模式?

一个可以工作的

  • 无论我的机器所在的语言环境如何
  • 保证正确释放互斥锁
  • 如果未获取互斥锁,则可选地不会永远挂起
  • 处理其他进程放弃互斥锁的情况
0 投票
6 回答
15353 浏览

java - 在同一个对象上同步两次?

我想知道如果我在同一个对象上同步两次,在 Java 中是否会出现任何奇怪的行为?

场景如下

两种方法都使用对象并在其上同步。第二种方法被第一种方法调用时会因为被锁定而停止吗?

我不这么认为,因为它是同一个线程,但我不确定可能会出现任何其他奇怪的结果。

0 投票
10 回答
4742 浏览

c - 从全局结构中读取时是否需要信号量?

一个相当基本的问题,但我没有看到它在任何地方被问到。

假设我们有一个全局结构(在 C 中),如下所示:

我似乎很清楚,如果我们有很多线程读写,我们需要一个信号量(或其他锁)在written_frequently成员上,即使是读取,因为我们不能 100% 确定这个结构的分配是原子的.

如果我们想要很多线程来读取read_only成员,而没有线程来写入,那么我们是否需要在结构访问上设置一个信号量来读取?

(我倾向于说不,因为不断更改之前和之后的位置这一事实不应该影响read_only成员,并且读取该值的多个线程不应该相互干扰。但我不确定。 )


[编辑:我现在意识到我应该更好地问这个问题,以便非常具体地澄清我的意思。当然,当我第一次问这个问题时,我并没有真正理解所涉及的所有问题。当然,如果我现在全面编辑问题,我会毁掉所有这些好答案。我的意思更像是:

我问的主要问题是,由于这些数据是结构的一部分,它是否会受到其他结构成员的影响,是否会反过来影响它们?

事实上,成员是整数,因此写入可能是原子的,在这种情况下实际上只是一个红鲱鱼。]

0 投票
9 回答
44893 浏览

c# - return 语句应该在锁的内部还是外部?

我刚刚意识到,在我的代码中的某个地方,我在锁内有 return 语句,有时在外面。哪一个是最好的?

1)

2)

我应该使用哪一个?