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

0 投票
2 回答
1170 浏览

multithreading - 如何使用 Win32 API 实现类 java 同步(监视器)?

每个 Java 对象(及其类)都有一个关联的监视器。在 pthread 术语中,Java 监视器等同于可重入互斥锁和条件变量的组合。

对于锁定,Win32 API 提供 Mutex 对象(可重入但重量级)和关键部分(不可重入但轻量级)。它还提供了其他同步结构,例如信号量和事件,但没有明确的条件变量概念。

如果我正在编写一个 JVM,我如何使用这些 Win32 概念来实现 Java 监视器?

0 投票
4 回答
3164 浏览

synchronization - 信号量的共识数是多少?

(我认为)互斥体的共识数是 2。

信号量的共识数是多少(如在 pthread_sem_* 中)?

条件变量的共识数是多少(例如在 pthread_cond_* 中)?

0 投票
3 回答
45614 浏览

c++ - 条件变量、互斥锁和锁的区别

例如c++0x 接口

我很难弄清楚什么时候使用这些东西(cv、mutex 和 lock)。任何人都可以请解释或指向资源吗?

提前致谢。

0 投票
3 回答
1859 浏览

c - 使用 pthread_cond_wait 和 pthread_cond_signal 保证让步

假设我有一个具有 3 个 POSIX 线程的 C 程序,共享一个全局变量、互斥体和条件变量,其中两个正在执行以下伪代码:

第三次运行:

假设第三个线程将看到前两个线程的数据是否安全?

换一种说法,如果一个线程正在等待一个互斥锁和一个条件变量,是否可以安全地假设如果发出信号,它将是下一个获得锁的线程,而不是可能正在等待的其他线程锁?

0 投票
1 回答
2482 浏览

c - pthread_cond_wait 不解锁互斥锁

我在网上找不到任何pthread_cond_wait在 Mac OS X 上奇怪的证据,但它似乎没有通过对我来说最简单的测试。

功能

应该解锁互斥量参数#2,然后等待在条件参数#1上发送信号。我编写了一个简单的程序来测试它,并测试虚假唤醒:

但它只获得一次锁。为了简单起见,主线程甚至不会尝试获取锁。

如果我在pthread_mutex_unlock之后添加 a pthread_cond_wait,它的行为将符合预期。(或者正如你所期望的那样,只有一半的锁定机制。)那么,什么给了?

0 投票
3 回答
8353 浏览

pthreads - POSIX 线程:条件变量 - 有什么意义?

我最近一直在使用 pthreads,但有一点我还不太明白。我知道条件变量旨在等待特定条件实现(或“发出信号”)。我的问题是,这与普通互斥锁有什么不同?

据我了解,当条件变为真时,条件变量不只是一个具有额外逻辑的互斥锁来解锁另一个互斥锁(并再次锁定它)吗?

伪代码示例:

所以这个例子中的 cond_wait 解锁mymutex,然后等待mycond被发送信号。

如果是这样,条件变量不只是具有额外魔力的互斥锁吗?还是我对互斥锁和条件变量的基本原理有误解?

0 投票
3 回答
2492 浏览

c - 在 C 中使用条件变量实现优先级队列

我目前对条件变量的理解是,所有阻塞(等待)的线程都被插入到一个基本的 FIFO 队列中,当调用 signal() 时,第一项被唤醒。

有没有办法修改这个队列(或创建一个新结构)来代替优先级队列?我已经考虑了一段时间,但大多数解决方案最终都受到 CV 和互斥体固有的现有队列结构的阻碍。

谢谢!

0 投票
2 回答
2862 浏览

python - python中的threading.Condition变量是否有替代方案可以更好地支持超时而无需轮询?

我在需要超时的线程中使用条件变量。直到看到运行大量线程时的 CPU 使用率,我才注意到线程模块中提供的条件变量实际上并没有休眠,而是在提供超时作为参数时进行轮询。

是否有替代方案实际上像 pthreads 一样睡觉?

让很多线程以多秒的间隔休眠似乎很痛苦,但它仍然在消耗 CPU 时间。

谢谢!

0 投票
3 回答
123 浏览

.net - 如何将信号连接到 .NET 中的复杂电路?

对于一些并发代码,我想将一堆信号像电路一样连接在一起。在 .NET 中,我们可以对信号集合执行 WaitAll 或 WaitAny。我想做这样的事情:

不幸的是,该库不支持将这些操作组合成更复杂的树。我的问题是(1)有没有办法在 .NET 中做到这一点?(2) 是否有任何语言的精巧库?

[编辑:科里询问更多细节]

我想建立一个消息传递库。可能有 10K 小并发队列,其中一些带有消息。我想从队列中获取消息并执行分配给队列的处理程序。但是,在处理程序完成之前我无法获取下一条消息(每个队列单线程)。所以我真的想在弹出并执行下一个项目之前等待队列(收到消息?)和代码(完成上一条消息?)。

0 投票
1 回答
25417 浏览

c++ - 在生产者-消费者情况下使用条件变量

我正在尝试了解条件变量以及如何在生产者-消费者情况下使用它。我有一个队列,其中一个线程将数字推入队列,而另一个线程从队列中弹出数字。当生产线程放置一些数据时,我想使用条件变量向消费线程发出信号。问题是有时(或大多数时候)它最多只能将两个项目推入队列然后挂起。我已经在生产()函数中指出它在调试模式下运行时停止的位置。谁能帮我指出为什么会这样?

我有以下全局变量:

以下是我的消费者线程:

下面是我的生产者线程: