问题标签 [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 投票
2 回答
1074 浏览

c++ - c++多线程同步

这是我的问题的简化版本。

有 N 个线程在一个无限循环中执行以下 3 条指令:

我希望所有线程同时执行指令B,即只有当所有线程都到达B时,任何线程才应该开始执行B。所以,如果有一个线程已经执行了B-> C-> A,它应该在这里等到其他线程也准备好执行 B.

如果可能,请告诉我一个适用于 Windows 和 MAC 的便携式解决方案。

0 投票
3 回答
59473 浏览

java - 显示 java 同步块如何工作的示例代码

我正在学习 java 多线程,我发现很难理解同步块的工作原理:

请给出一些示例代码,可以显示对象 o 被阻止。据我了解,在执行同步块时,从另一个线程访问对象 o 将被阻止?

0 投票
2 回答
1338 浏览

c# - 用户范围的应用程序设置(在 VS 设计器中创建)线程安全吗?

我在我的 Visual Studio 项目中创建了应用程序设置,其中包含用户范围设置和应用程序范围设置。我的应用程序有几个线程可以同时访问读取或写入设置。我搜索了 MSDN 以查看可以在运行时更新的用户范围设置是否是线程安全的,但找不到明确的答案。有人知道吗?

提前致谢!

0 投票
0 回答
283 浏览

multithreading - 这是我的 DirectShow 推送源过滤器(相当)防弹的 Windows 线程同步策略吗?

我有一个使用 DSPACK 组件库用 Delphi 6 编写的 DirectShow 推送源过滤器。我正在为推送源过滤器的 FillBuffer() 调用实施阻塞策略。推送源过滤器将音频数据接收到存储在缓冲区集合中的一个或多个缓冲区中。缓冲区集合中的每个方法都受临界区保护。

集合中的每个缓冲区都由不同的源提供数据,并且每个源都有自己的线程。FillBuffer() 调用会阻塞,直到集合中的每个缓冲区都有足够的数据来满足 FillBuffer() 被要求提供的数据量,因为数据混合在一起形成一个合并的缓冲区,然后返回给调用者。

这是我为避免竞争条件和死锁而设计的策略。缓冲存储集合有一个称为isEnoughData()的方法,它执行此操作:

  1. 获取保护集合中所有其他方法的相同关键部分。
  2. 迭代每个缓冲区检查以查看每个缓冲区是否有足够的数据来满足当前请求。
  3. 如果有足够的数据,则返回 TRUE
  4. 如果没有足够的数据,则获取一个用于方便阻塞的Mutex,返回 FALSE,并将请求的无法填充的字节数存储在 FNumPendingBytesRequested 中。
  5. 在返回之前,它当然会释放关键部分。

FillBuffer() 执行以下操作:

  1. 调用 isEnoughData()
  2. 如果返回 TRUE,它将混合(合并的缓冲区)数据返回给提供的Sample中的调用者。
  3. 如果为 FALSE,它会在上面概述的isEnoughData()调用期间由集合获取的Mutex上执行 WaitForSingleObject() ,从而阻塞直到出现足够的数据。当它获取Mutex时,它从集合中获取数据并将其返回给调用者,然后释放Mutex

存储集合中将数据添加到集合中任何缓冲区的所有方法在返回之前检查是否现在可以满足 FNumPendingBytesRequested。如果是这样,则释放互斥锁,从而解除对 FillBuffer() 调用的阻塞,然后获取数据并将其返回。自然,该集合在销毁时会释放Mutex 。

这对我来说似乎很防弹。我相信它可以充分保护对 isEnoughData() 的 FillBuffer() 调用和向集合添加数据的其他线程之间的竞争条件。我也看不到任何可能发生竞争条件或死锁的地方。我对此是否正确?任何有关该策略的提示或警告也值得赞赏。

最大的问题:我能看到的唯一潜在问题是,在 FillBuffer() 有机会调用WaitForSingleObject()并阻塞之前,另一个线程是否添加了足够的数据来释放Mutex 。但我的理解是,在不属于任何人的同步对象上调用WaitForSingleObject()会立即返回对象的所有权,因此这应该不是问题,因为这意味着现在可以使用必要的数据。我的理解正确吗?

0 投票
3 回答
5106 浏览

java - Java 线程池同步

我想执行以下算法 - 这必须在 Java 中完成

由于开销(以及每个线程将有 <20 毫秒的工作时间),线程不会被连续创建和销毁是可取的,这带来了线程池1的想法。我也知道使用 Executable 2可以调用shutdown,然后调用awaitTermination。然而,由于循环,在这种情况下它是不可取的。那么线程同步怎么会发生呢?

我想像使用传统线程的 join() 方法一样同步线程池中的线程。

0 投票
1 回答
344 浏览

.net - 学习实现线程池 - 使用 autoresetevent 时信号事件丢失

我坚信通过重塑来学习。带着这种心态,我着手实现自定义线程池。我为自己设定的目标如下:

  1. 能够在线程池中对工作项进行排队。
  2. 能够处理具有固定数量线程的工作项——所有线程同时创建。
  3. 普通工作线程函数应该只知道如何 deque,而不应该处理其他函数/属性,如 IsEmpty 或 Count。

我成功地实现了上述目标,但想验证我与 stackoverflow 专家一起采用的方法。另外,想了解是否有更好的方法,或者多线程专家将如何解决这个问题。以下段落提到了我面临的挑战以及我是如何解决的。

我创建的线程池在内部维护了一个工作项队列,所有工作线程都从该队列中选择并处理它。每当一个新项目排队时,它都会发出一个事件信号,以便任何空闲线程都可以拾取并执行它。

我从 autoresetevent 开始向队列中任何新工作项的等待线程发出信号,但我遇到了丢失信号事件的问题。当多个项目排队并且没有空闲线程来处理该项目时,就会发生这种情况。未处理的项目总数与由于重叠集合(信号)事件而丢失的信号事件总数相同。

为了解决丢失信号事件的问题,我在 autoresetevent 之上创建了一个包装器,并使用它来代替 autoresetevent。它解决了这个问题。这是相同的代码清单:

现在,我有几个问题:

  1. 我的方法是否充分证明?
  2. 什么同步机制最适合这个问题,为什么?
  3. 多线程专家将如何处理这个问题?

谢谢。

0 投票
3 回答
914 浏览

java - java中如何在不影响效率的情况下实现线程同步

说使用以下功能:

当同时调用此方法时,多个线程共享相同的 MyObject 值,但我希望每个线程都有一个唯一的值。

为了解决这个问题,我使用线程同步class.getInstance().myMethodCall()来获取某些属性的唯一值,这解决了目的,但是随着同时调用的到来,它降低了函数的效率。

有没有更好的方法来解决这个问题?(使用STRUTS,HIBERNATE3.0)

0 投票
1 回答
134 浏览

multithreading - 这种情况下如何设计线程同步

我的要求如下

  1. 有一个具有多个线程的进程。
  2. 其中一个线程 (T1) 由用户事件触发
  3. 有一个任务需要在一个单独的线程(T2)中完成,它应该由 T1 产生
  4. 现在,T1 应该检查系统是否已经在 T2 中执行任务。如果不是,那么它应该生成 T2 然后退出。如果 T2 仍在运行,那么我应该通过记录错误从 T1 返回。我不想在 T2 完成之前持有 T1。
  5. T2 通常需要很长时间。因此,如果 T1 在 T2 完成之前被触发,它应该只是返回一个错误。
  6. 意图是在任何情况下我们都应该有两个 T2 线程

我正在使用互斥锁和信号量来执行此操作,但可能有更简单的方法。这就是我所做的。

T1:

T2:

这很好用。但我想知道是否有更简单的方法可以做到这一点。

0 投票
0 回答
439 浏览

c# - WIAScanner 类仅在平板上扫描。设备属性为空...出了什么问题?

我正在使用来自http://miljenkobarbir.com/using-a-scanner-without-dialogs-in-net/的现有类 ,它根本不起作用。当它应该从文档进纸器扫描时,它会从平板扫描。唯一有效的是它检测到我的设备是无线的,但设备属性为空。不会抛出异常。

PS我正在从另一个线程而不是UI线程调用Scan方法,但我使用了像下面这样的锁

0 投票
2 回答
908 浏览

java - 如何使用 2 个线程避免 ArrayList 中的 NullPointerException

我正在创建一个 Android 游戏,但遇到了问题。我有 2 个线程:OpenGL 线程和游戏循环。我使用 ArrayLists 来存储我的可渲染对象,这就是问题所在。有时我需要在游戏线程中删除这些对象,有时它会导致 OpenGL 线程获取 NullPointerException,因为据我了解,它通过集合并突然删除了一个元素。我想我应该让 OpenGL 线程删除对象,但还有其他解决方案吗?如果游戏循环开始获取空元素怎么办?也许我可以以某种方式制作同步线程,尽管我仍然不明白“同步”是如何工作的。谢谢。

这会有帮助吗?我应该把它放在我对 ArrayList 做某事的任何地方吗?