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

java - 线程访问 Java 中的非同步方法

我能解释一下Java中的线程和同步是如何工作的吗?

我想写一个高性能的应用程序。在这个应用程序中,我将文件中的数据读取到一些嵌套类中,这些类基本上是围绕 HashMap 的一个坚果壳。

数据读取完成后,我启动需要遍历数据并对其执行不同检查的线程。但是,线程永远不会更改数据!

如果我可以保证(或至少尝试保证;)我的线程永远不会更改数据,我可以使用它们调用包含数据的对象的非同步方法吗?

如果多个线程访问非同步方法,不改变任何类字段,但有一些内部变量,是否安全?

人工示例:

从线程调用非同步方法 returnBigSpikes() 是否安全?

我现在明白这样的用例可能非常危险,因为很难控制数据(例如,返回的 bigSpikes)不会被修改。但是我已经像这样实现和测试了它,想知道我现在是否可以使用我的应用程序的结果,并在以后更改架构......

如果我使方法同步会发生什么?会不会将应用程序的 CPU 性能减慢到 1?如果是这样,我怎样才能正确设计它并保持性能?

(我将大约 20-40 Gb 的数据(日志消息)读入主内存,然后运行线程,这些线程需要遍历所有数据以找到其中的一些相关性;每个线程仅成为要分析的消息的一部分;但是为了进行分析,线程应该将其部分的每条消息与来自数据的许多其他消息进行比较;这就是为什么我首先决定允许线程在不同步的情况下读取数据)。

非常感谢您提前。

0 投票
1 回答
778 浏览

c# - 缓存,仅在更新资源时同步线程

我在 SO 和其他网站上阅读了很多关于缓存和线程同步的内容,但我仍然无法回答我的问题。

用于静态字典缓存的 .NET 线程安全

锁是如何工作的?

为什么要对单独的对象执行锁定?

http://msdn.microsoft.com/en-us/magazine/cc188793.aspx

...

我正在尝试实现一个缓存,该缓存公开只能从外部读取的资源。这些资源可以更新,但不会经常更新,也不会花费太多时间。

基本上,资源是键值列表(id 和字符串)并且不是很大(一百个元素不多)。

因此,我不想在 read 方法上加锁以避免同步开销,因为它在大多数情况下都不是必需的,但我想在需要更新资源时使用它。

我的问题是:有没有办法做这样的事情:

另外,尝试实现这一点真的有用吗,还是我走错了路,应该在Get方法中使用锁?

编辑:

好的,经过更多的谷歌搜索,我会有一个更精确的问题:是否有可能知道其他线程是否正在使用类引用,如果是,请等待该线程完成使用它?

0 投票
1 回答
438 浏览

c# - 线程同步问题,3个线程同时运行,第4个必须运行而其他线程正在等待

抱歉标题,我找不到更好的解释我的问题...

我很难在我的应用程序中同步不同的线程。对于对这个问题有新看法的人来说,这可能是一个简单的问题,但是经过数小时对死锁的调查,我的脑袋快要爆炸了,我找不到一个好的和安全的方法来编写我的同步机制:(

基本上,我有一个在多个线程中运行的 .Net 进程(一切都在一个进程中,因此不需要 IPC)。我有 4 个线程:

  • 1个线程,说它叫做SpecificThread。有一个System.Timers.Timer定期执行一些代码。
  • 3 个其他线程,每个线程都运行一个定期执行某些代码的服务(while (true)循环 + Thread.Sleep(few ms))。

所有 3 项服务必须同时运行。我保证它们的并发执行是线程安全的。第四个线程SpecificThread必须定期执行其代码,但它必须阻止其他 3 个服务的执行

所以基本上我有SpecificThread定期执行代码。当SpecificThread想要定期执行其代码时,它必须等待其他服务完成它们的任务。当所有其他 3 个服务完成他们的任务时,它必须执行其SpecificCode而其他 3 个服务被阻止。当其SpecificCode被执行时,其他3个服务可以再次运行它们的代码。

我有一个SynchronizationContext在所有 4 个线程之间共享的对象的共享实例。我可以用它来同步我的线程:

3个服务执行机制如下:

具体线程执行机制:

我不知道如何使用关键部分,因为只有SpecificThread在其他部分等待时才必须运行。我没有找到一种方法,Semaphore也没有AutoResetEvent(它们的使用在我的代码中引入了难以调试的死锁)。我的想法已经用完了......也许Interlocked静态方法会有所帮助?

最后一句话:我的代码必须使用 .Net 3.5 运行,我不能使用任何 TPL 或CountdownEvent类...

任何帮助表示赞赏!

0 投票
1 回答
886 浏览

c# - 后台工作程序运行时 WPF 更新文本框

我正在尝试在运行时不断更新我TextBoxBackgroundWorker

我正在使用的代码冻结了我的应用程序:

0 投票
1 回答
157 浏览

multithreading - 与多个对象的线程同步

这个问题困扰我好几天了,求大神帮忙。我正在使用线程同步实现生产者-消费者示例。我在这个传统的节目中做了一些改变。我没有只使用一个队列对象,而是使用了两个队列对象。但是程序不工作..(PS-我知道我可以通过只使用一个队列对象来使这个程序工作,但是如果我想使用两个队列对象怎么办??)

类队列{

}

类生产者实现 Runnable {

}

类消费者实现可运行{

}

公共类TestQueue {

}

0 投票
1 回答
1020 浏览

memory-management - CUDA:线程可以创建所有数据的单独副本吗?

我有一个非常基本的问题,在浏览文件后我无法理解。我在执行我的一个项目时遇到了这个问题,因为我得到的输出完全损坏了,我相信问题要么出在内存分配上,要么出在线程同步上。好的,问题是:每个线程都可以创建传递给内核函数的所有变量和指针的单独副本吗?或者它只是创建变量的副本,但我们传递该内存的指针在所有线程之间共享。例如

所以我将 dDC4_in 和 dDC4_out 指针传递给 GPU,其中 dDC4_in 用一些值初始化并计算 dDC4_out 并复制回主机,所以我的所有 1280 个线程都将具有单独的 dDC4_in/out 副本,或者它们都将在 GPU 上的相同副本上工作覆盖其他线程的值?

0 投票
4 回答
104 浏览

java - Java 线程访问另一个线程

我有两个实现 Runnable 接口的对象。

可以说我有Thread_1Thread_2对象。

Thread_1有全局变量myVariable;和使用myVariable变量的方法myMethod() 。

Thread_2具有Thread_1类型的变量

所以这里是场景:

两个线程:Thread_1Thread_2都在运行。

如果Thread_1当前正在使用myMethod()(它使用myVariable),同时Thread_2正在使用Thread_1myVariableThread_1(不调用myMethod()方法),我是否应该同步myVaribale变量?

0 投票
3 回答
466 浏览

java - Java Puzzler:繁忙的等待线程停止工作

这是某种Java Puzzler,我偶然发现并无法真正解释。也许有人可以?

以下程序在短时间内挂起。有时在 2 次输出之后,有时在 80 次之后,但几乎总是在正确终止之前。如果第一次没有发生,您可能需要运行几次。

现在,很明显,繁忙的等待循环通常不是一个好主意。但这不是关于改进,而是关于了解正在发生的事情。

由于一切都按预期工作,WorkerThread.setWork()或者synchronized当该WorkerThread.workToDo字段设置为时,volatile我怀疑存在内存问题。

但究竟为什么会发生呢?调试无济于事,一旦您开始单步执行,一切都会按预期运行。

解释将不胜感激。

0 投票
1 回答
410 浏览

c# - 书中的短语“当前 SynchronizationContext 是当前线程的属性”是否正确?

读过“当前 SynchronizationContext 是当前线程的属性”正确的短语后,我有点困惑......

在 VS2010 的 C# 应用程序代码中,当我键入时,我Thread.CurrentThread.在 Intellisense 给出的选项下拉列表中找不到线程的任何上下文相关属性。

我知道当前的同步上下文可以通过 " = SynchronizationContext.Current;" 获得。但这对于在并行线程、任务等中同时执行并不是很幸运。

假设从控制台或 WPF (*)应用程序中,我在其自己的主 UI 线程以及 TPL 任务 中创建并启动了一些 Windows 窗体。

我认为每个winform都应该有自己的WindowsFormaSynchronizationContext,WPF 应该有自己的DispatcherSynchronizationContextSynchronizationContext 类的子类)实例,任务在具有自己的同步上下文的ThreadPool中执行, LongRunning 任务或者可能会在其线程池中执行自己的同步上下文...

那么,为什么不能SynchronizationContext从线程中定义呢?“从给定线程获取 SynchronizationContext”问题的所有答案似乎都在否定这种可能性......

最后但并非最不重要的一点是:“当前 SynchronizationContext 是当前线程的属性”
这句话是否正确? 那么,我如何才能为不同的特定线程实例获取此属性的值?

(*)
最近,我收到了基本上使用 winforms 的 C# WPF 应用程序代码。

0 投票
4 回答
1427 浏览

c - 两个线程可以使用相同的线程过程吗?

当使用 CreateThread() 时,两个线程是否可以使用单个函数“ThreadProc”作为其线程过程?

上面的代码会创建两个线程,每个线程都具有相同的功能(因为两个线程的线程过程是相同的。)我做对了吗?

如果有可能,那么会有任何同步问题,因为两个线程都使用相同的线程过程。

请帮我解决一下这个。我真的很困惑,在互联网上找不到任何东西。