问题标签 [thread-synchronization]

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 投票
9 回答
12498 浏览

locking - 监视器和锁定之间的区别?

监视器有什么区别?

如果锁只是互斥的一种实现,那么监视器只是一种利用方法执行之间的等待时间的方法吗?

一个好的解释将非常有帮助谢谢....

问候

0 投票
2 回答
21417 浏览

c++ - 比较和交换与测试和设置

有人可以向我解释一下多线程中上述操作的工作原理和区别吗?

0 投票
1 回答
106 浏览

object - 选择正确的对象来锁定线程同步?

通常代码示例以这种方式使用锁:

这样我们就需要在一个大类中使用许多锁。将共享对象本身用作同步对象是一种好习惯吗?

0 投票
2 回答
2586 浏览

multithreading - 信号量小书

下面是代码,其中每个线程必须等待其他线程完成集合部分,然后等到每个人都完成关键部分。

我知道两个进程可以达到相同的计数值(0 或 n 可能)的情况。因此,可以同时发送两个或多个信号。上次测试怎么会出现死锁。我似乎不明白这一点。
这是一种旋转门信号量安排,作者实际上认为它是一个旋转门,但它是一个信号量,它应该在没有死锁的情况下工作。请告诉我这段代码怎么会出现死锁!

0 投票
2 回答
1050 浏览

java - Java中Semaphore的图书馆员资源分配问题

请帮我解决这个由两部分组成的问题。这是第一部分:

(第 2 部分:我已经更新了代码 - 要求发生了一些变化。)

我正在尝试在 Java 中实现图书管理员问题。维基百科上的Semaphore 页面给出了 Semaphore 的类比库。在第一部分,我试图模拟这个问题。就我而言,我使用的是 [主题专家] 而不是房间作为资源。

假设一个图书馆有 10 个相同的自习室,打算一次只供一个学生使用。为防止发生纠纷,学生如果想使用自习室,必须向前台申请房间。当学生用完一个房间后,学生必须回到柜台并指出一个房间已经空闲。如果没有空房间,学生会在柜台等待,直到有人让出房间。

由于房间是相同的,前台的图书管理员不会记录哪个房间被占用,只记录可用房间的数量。当学生请求一个房间时,图书管理员会减少这个数字。当学生释放一个房间时,图书管理员会增加这个数字。一旦获得进入房间的权限,房间就可以根据需要使用多久,因此无法提前预订房间。

我在实施中面临的问题是关于学生与主题专家的关联。在接下来的 secnario 中,您将如何做到这一点?所需SubjectMatterExpert要做的就是打印学生 ID(现在)。

第 2 部分:新要求:
- 有固定数量的学生、SME 和书柜
- 学生在开始时有一定数量的书籍(目前,书籍只是数字)
- SME 在书柜中添加或签出书籍学生的请求
- 学生指定添加或签出操作、书籍数量和书柜

这是修改(编辑)的学生类:

这是修改(编辑)的图书管理员类:

这是修改(编辑)的主题专家类:

这是修改(编辑)的模拟器类:

这是(新的)Book Closet 类:

0 投票
2 回答
1028 浏览

c# - C#.NET 线程问题

我面临 C#.NET 应用程序中线程之间的通信问题。希望有人能就可能的解决方案引导我朝着正确的方向前进。

我在 C#.NET 中有一个应用程序。它是一个 Windows 窗体应用程序。我的应用程序有两个线程 - 一个线程是主线程(UI 线程),另一个是子线程。让我们称子线程为“workerThread” 应用程序中只使用一个表单。让我们称这个表单为“MainForm”

子线程在 MainForm 加载时启动(使用表单的“Load”事件处理程序启动线程)

在 MainForm 类中,我有一个名为“stopWork”的变量,它是一个公共布尔变量,它用作指示子线程是应该继续工作还是应该停止的标志

我有另一个类(除了 MainForm 类),它包含我在子线程中执行的方法。让我们将这第二类称为“WorkerClass”。我将对当前表单(MainForm)的引用传递给“WorkerClass”的构造函数

我在主窗体中有一个“停止”按钮,如果单击它,它将“stopWork”设置为“true”,然后调用“workerThread.Join()”来等待子线程完成执行。

在子线程中,“doWork”方法在for循环中不断检查“parentForm.stopWork”的状态。如果“stopWork”设置为“true”,则循环中断,随后该方法结束。

现在,问题是,一旦我单击“停止”按钮,应用程序就会挂起。

我在下面粘贴部分代码,以便更容易理解:

我想我可能知道问题出在哪里。问题在于子线程中的“doWork”方法试图访问父表单中的“stopWork”变量,而父表单已经通过调用“workerThread.Join()”方法被阻止。所以,我认为这是一个“死锁”问题。

我确定问题是否正确?还是我错了,问题出在其他地方?

如果这确实是一个死锁,有什么可能的解决方案来解决这个问题?

我做了一些谷歌搜索,发现了很多关于线程同步以及如何避免死锁的资源。但我不明白如何将它们专门应用于我的问题。

我非常感谢任何有关解决此问题的帮助或指导。

0 投票
2 回答
15894 浏览

c++ - CMutex::Lock 与 CSingleLock::Lock

我被指派支持一些遗留代码,我看到一些让我困惑地挠头的事情。在某些代码段中,我看到一个类实例使用 CMutex 实例来同步方法执行。例如

在同一个项目的其他地方,我发现代码使用的是 CSingleLock

在查看了有关同步的 MSDN 文档后,似乎 CClassB 正在实现建议的方法,但我不清楚 CClassA 使用的实现中存在什么危险。据我所知,这两种方法的唯一区别是 CSingleLock 具有 RAII 的好处,所以当执行退出作用域时,锁会自动释放。这两种实施方式是否还有其他优点/缺点?

0 投票
1 回答
250 浏览

multicore - 可变变量和多核线程同步!

我有几个线程同时执行并检查它们自己对象中字段的值。该字段由启动线程设置,如下所示:

然后在每个线程中检查这个值的值:

但是,我注意到在 4 核 CPU 上,一些 (4) 个正在运行的线程需要几毫秒甚至更长的时间才能看到更改后的 MyField。MyField 是一个单字符字段。似乎正在发生的事情是,当内存总线被检测到更改的第一个线程最大化时,所有其他线程可能几乎在第一个运行的整个持续时间内都停止。(假设有足够的内存压力)。只有当第一个线程减少内存(并且对寄存器做更多的事情)时,其他线程也可以看到新值。

我检查了asm,这里没有编译器优化。调用直接进入内存。如何解决这个问题?

谢谢!果酱

0 投票
1 回答
474 浏览

c# - 线程同步

数据必须在线程之间共享。哪种同步方法最好?

锁是更好的方法还是互斥锁?

0 投票
2 回答
3427 浏览

multithreading - 使用二进制信号量实现屏障(一种同步结构)

屏障是一种同步结构,其中一组进程全局同步,即集合中的每个进程到达屏障并等待所有其他进程到达,然后所有进程离开屏障。令集合中的进程数为 3,S 为具有常用 P 和 V 函数的二进制信号量。考虑以下 C 实现的屏障,其中行号显示在左侧。

变量 process_arrived 和 process_left 在所有进程之间共享并初始化为零。在并发程序中,所有三个进程在需要全局同步时都会调用屏障函数。

上述实施会奏效吗?我认为如果立即连续使用两个屏障调用可能会导致死锁,因为进入屏障的第一个进程不会等到 process_arrived 变为零才继续执行 P(S)。