问题标签 [condition-variable]
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.
multithreading - 如何使用 Win32 API 实现类 java 同步(监视器)?
每个 Java 对象(及其类)都有一个关联的监视器。在 pthread 术语中,Java 监视器等同于可重入互斥锁和条件变量的组合。
对于锁定,Win32 API 提供 Mutex 对象(可重入但重量级)和关键部分(不可重入但轻量级)。它还提供了其他同步结构,例如信号量和事件,但没有明确的条件变量概念。
如果我正在编写一个 JVM,我如何使用这些 Win32 概念来实现 Java 监视器?
c - 使用 pthread_cond_wait 和 pthread_cond_signal 保证让步
假设我有一个具有 3 个 POSIX 线程的 C 程序,共享一个全局变量、互斥体和条件变量,其中两个正在执行以下伪代码:
第三次运行:
假设第三个线程将看到前两个线程的数据是否安全?
换一种说法,如果一个线程正在等待一个互斥锁和一个条件变量,是否可以安全地假设如果发出信号,它将是下一个获得锁的线程,而不是可能正在等待的其他线程锁?
c - pthread_cond_wait 不解锁互斥锁
我在网上找不到任何pthread_cond_wait
在 Mac OS X 上奇怪的证据,但它似乎没有通过对我来说最简单的测试。
功能
应该解锁互斥量参数#2,然后等待在条件参数#1上发送信号。我编写了一个简单的程序来测试它,并测试虚假唤醒:
但它只获得一次锁。为了简单起见,主线程甚至不会尝试获取锁。
如果我在pthread_mutex_unlock
之后添加 a pthread_cond_wait
,它的行为将符合预期。(或者正如你所期望的那样,只有一半的锁定机制。)那么,什么给了?
pthreads - POSIX 线程:条件变量 - 有什么意义?
我最近一直在使用 pthreads,但有一点我还不太明白。我知道条件变量旨在等待特定条件实现(或“发出信号”)。我的问题是,这与普通互斥锁有什么不同?
据我了解,当条件变为真时,条件变量不只是一个具有额外逻辑的互斥锁来解锁另一个互斥锁(并再次锁定它)吗?
伪代码示例:
所以这个例子中的 cond_wait 解锁mymutex
,然后等待mycond
被发送信号。
如果是这样,条件变量不只是具有额外魔力的互斥锁吗?还是我对互斥锁和条件变量的基本原理有误解?
c - 在 C 中使用条件变量实现优先级队列
我目前对条件变量的理解是,所有阻塞(等待)的线程都被插入到一个基本的 FIFO 队列中,当调用 signal() 时,第一项被唤醒。
有没有办法修改这个队列(或创建一个新结构)来代替优先级队列?我已经考虑了一段时间,但大多数解决方案最终都受到 CV 和互斥体固有的现有队列结构的阻碍。
谢谢!
python - python中的threading.Condition变量是否有替代方案可以更好地支持超时而无需轮询?
我在需要超时的线程中使用条件变量。直到看到运行大量线程时的 CPU 使用率,我才注意到线程模块中提供的条件变量实际上并没有休眠,而是在提供超时作为参数时进行轮询。
是否有替代方案实际上像 pthreads 一样睡觉?
让很多线程以多秒的间隔休眠似乎很痛苦,但它仍然在消耗 CPU 时间。
谢谢!
.net - 如何将信号连接到 .NET 中的复杂电路?
对于一些并发代码,我想将一堆信号像电路一样连接在一起。在 .NET 中,我们可以对信号集合执行 WaitAll 或 WaitAny。我想做这样的事情:
不幸的是,该库不支持将这些操作组合成更复杂的树。我的问题是(1)有没有办法在 .NET 中做到这一点?(2) 是否有任何语言的精巧库?
[编辑:科里询问更多细节]
我想建立一个消息传递库。可能有 10K 小并发队列,其中一些带有消息。我想从队列中获取消息并执行分配给队列的处理程序。但是,在处理程序完成之前我无法获取下一条消息(每个队列单线程)。所以我真的想在弹出并执行下一个项目之前等待队列(收到消息?)和代码(完成上一条消息?)。
c++ - 在生产者-消费者情况下使用条件变量
我正在尝试了解条件变量以及如何在生产者-消费者情况下使用它。我有一个队列,其中一个线程将数字推入队列,而另一个线程从队列中弹出数字。当生产线程放置一些数据时,我想使用条件变量向消费线程发出信号。问题是有时(或大多数时候)它最多只能将两个项目推入队列然后挂起。我已经在生产()函数中指出它在调试模式下运行时停止的位置。谁能帮我指出为什么会这样?
我有以下全局变量:
以下是我的消费者线程:
下面是我的生产者线程: