问题标签 [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.

0 投票
8 回答
27986 浏览

synchronization - 使用 TestAndSet() 指令的互斥

Silberschatz、Galvin 和 Gagne 所著的《操作系统原理》一书在有关同步的章节中包含 TestAndSet() 指令的以下定义:

还提供了使用上述指令的互斥实现如下:

现在,如果没有将target设置为TRUE的条件,如何实现互斥呢?

考虑以下情况,进程 P0 将共享变量设置为 TRUE 并进入其临界区。另一个进程 P1 在上面的 while 循环中调用 TestAndSet(),它返回 TRUE(因为 P0 有锁),同时无条件地将设置为 FALSE。在 while 循环中第二次调用 TestAndSet() 时,它将返回 FALSE 并且 P1 进入其临界区,即使 P0 处于其临界区。然后违反了互斥。

我进行了一些搜索,偶然发现了 Mithun Acharya 和 Robert Funderlic(北卡罗来纳州立大学计算机科学系)的一篇论文,其中包含 TestAndSet() 的以下替代定义:

这对我来说更有意义,我将其包括在内以进行比较,还因为该论文将 Silberschatz 的书列为参考文献之一。

我只是不明白我在教科书中找到的定义(我首先提供的那个)如何用于实现互斥,有人可以帮忙吗?

0 投票
11 回答
48005 浏览

c - 我的自旋锁实现是否正确且最优?

我正在使用自旋锁来保护一个非常小的关键部分。争用很少发生因此自旋锁比常规互斥锁更合适。

我当前的代码如下,并假设 x86 和 GCC:

所以我想知道:

  • 这段代码正确吗?它是否正确地确保了互斥?
  • 它适用于所有 x86 操作系统吗?
  • 它也适用于 x86_64 吗?在所有操作系统上?
  • 是最优的吗?
    • 我见过使用比较和交换的自旋锁实现,但我不确定哪个更好。
    • 根据 GCC atomic builtins 文档(http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html),还有__sync_lock_release. 我不是记忆障碍方面的专家,所以我不确定我是否可以使用它而不是__sync_synchronize.
    • 我正在针对没有争用的情况进行优化。

我根本不在乎争吵。可能有 1 个,也可能有 2 个其他线程试图每隔几天锁定一次自旋

0 投票
2 回答
2049 浏览

attributes - 如何在 UML 中建模互斥属性?

我正在 UML 中建立一个分析模型,当我试图在类图中表示对几个属性的约束时,我有点卡住了。在以下课程中:

所有列出的属性都是布尔类型,最后两个isBazisQuux是互斥的。我该如何表示?我宁愿不使用临时笔记——更混乱。

我能找到的关于 UML 中约束的所有内容似乎都将它们应用于关联,而不是属性。我可以将属性分解为一个关联的类,但它们是简单的布尔类型,所以这样的事情似乎有点过头了:

在 UML 中对互斥属性建模的“正确”方法是什么?

0 投票
2 回答
85 浏览

php - SELECT 限制为仅基于来自单独表的 CSV 列表的结果

所以我在一张表中有一个 CSV 列表。(例如:) 1,3,19我想从另一个表中搜索所有用户名,其中 id 与其中任何一个匹配。

我觉得我应该能够做类似的事情:

但我无法让它工作。我究竟做错了什么?

0 投票
6 回答
1719 浏览

php - 什么相当于 PHP 中的 C# lock 语句?

为了并发和确保数据的完整性,您将如何获得给定对象的互斥锁?您是否需要在数据库或文件中使用锁定,或者 PHP 是否支持类似的东西?

0 投票
6 回答
3850 浏览

c# - C#:如何防止应用程序的两个实例同时做同样的事情?

如果您在应用程序中有两个线程,并且您不希望它们同时运行某段代码,则可以在该段代码周围加一个锁,如下所示:

但是你如何在不同的进程中做同样的事情呢?我认为这就是你使用“全局互斥锁”的目的,所以我Mutex以各种方式尝试了这个类,但它似乎没有满足我的要求,它们是:

  • 如果您是唯一的实例,请继续运行代码。
  • 如果您是第二个实例,请等待第一个实例完成,然后运行代码。
  • 不要抛出异常。

我遇到的问题:

  • 只是Mutex在子句中实例化一个对象using(){...}似乎没有任何作用。这两个实例仍然愉快地同时运行
  • 调用.WaitOne()Mutex 会导致第一个实例运行,第二个实例等待,但第二个实例无限期地等待,即使在第一个调用.ReleaseMutex()并离开using(){}范围之后也是如此。
  • .WaitOne()当第一个进程退出时抛出异常 ( System.Threading.AbandonedMutexException)。

我该如何解决这个问题?不涉及的解决方案Mutex非常受欢迎,特别是因为Mutex它似乎是特定于 Windows 的。

0 投票
2 回答
317 浏览

web-services - 如何防止对网页的多次访问?

假设我有一个 Web 服务,我只想提供一次内容。在提供该 URL 后,对该 URL 的任何其他访问都应生成错误消息。

我将如何去做这样的事情?如果 2 个客户端在同一时刻访问该 url 怎么办?

0 投票
5 回答
29485 浏览

php - PHP互斥(mutex)

阅读一些关于锁定 PHP 的文章。
它们都主要指向http://php.net/manual/en/function.flock.php

本页讨论在硬盘上打开文件!!

真的是这样吗?我的意思是,这使得锁定非常昂贵 - 这意味着每次我想锁定我都必须访问硬盘)=

可以再用一个令人愉快的消息来安慰我吗?

编辑:

由于我在这里得到了一些回复,我想问这个;
我的脚本只能由一个线程运行,还是由多个线程运行?因为如果它是一个,那么我显然不需要互斥锁。有简洁的答案吗?

我到底想做什么

由 ircmaxell 询问。
这是故事:

我有两个 ftp 服务器。我希望能够在我的网站上显示有多少在线用户在线。
所以,我认为这些 ftp 服务器会将它们的统计信息“发布”到某个 PHP 脚本页面。假设这个页面的 URL 是“ http://mydomain.com/update.php ”。

在网站的主页(“ http://mydomain.com/index.php ”)上,我将显示累积统计信息(在线用户)。

就是这样。

我的问题是我不确定,当一个 ftp 服务器更新他的统计数据而另一个也这样做时,信息是否会混淆。
就像多线程时一样;两个线程同时增加一些“int”变量。除非您在它们之间同步,否则它不会按预期发生。
那么,我会有问题吗?是的,不,也许?

可能的解决方案

整天苦苦思索,我在这里有个想法,希望你给出你的意见。
如前所述,这些 ftp 服务器将每 60 秒发布一次他们的统计信息。
我正在考虑拥有这个文件“stats.php”。
它将包含在 ftp 服务器转到的更新脚本(“update.php”)和访问者看到有多少用户在线的“index.php”页面中。
现在,当 ftp 服务器更新时,“update.php”处的脚本将使用新的累积统计信息修改“stats.php”。
首先它将读取“stats.php”中包含的统计信息,然后累积,然后重写该文件。

如果我没记错的话,PHP 会检测到文件(“stats.php”)已更改并加载新文件。正确的?

0 投票
3 回答
2087 浏览

regex - 互斥正则表达式

如果我有一个正则表达式列表,是否有一种简单的方法可以确定它们中的任何一个都不会返回相同字符串的匹配项?

也就是说,当且仅当对于所有字符串,列表中最多有一项与整个字符串匹配时,该列表才有效。

看起来这将很难(也许不可能?)明确地证明,但我似乎找不到任何关于这个主题的工作。

我问的原因是我正在研究一个接受正则表达式的标记器,我想确保一次只有一个标记可以匹配输入的头部。

0 投票
2 回答
765 浏览

ms-access - MS-Access 连接表在两个互斥列表之间插入/删除(2 个列表框)

有了这种设计,我想创建一个功能来添加和删除联结表中的记录。

案例来自于编辑员工并选择他们可以参加的考试。左侧列表框中将是他们没有资格参加的考试(无论如何)以及他们在右侧列表框中有资格参加的考试。

表是这样的:

EmpID始终已知,但ExamID将从左侧列表框中选择。右侧列表框中的记录可能必须同时具有 theEmpID和 theExamID才能被删除。

一旦它们进入各自的框,就不需要立即删除/插入(它们可以等到表单关闭)。

在 Access 中是否有一个好的/标准的方法来完成这个?