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

c++ - boost::condition::timed_wait 的使用示例

有人有一个如何最容易使用 boost::condition::timed_wait 的例子吗?此处此处此处有一些关于该主题的主题,但没有一个具有工作示例。并且 boost doc 像往常一样非常稀疏。

0 投票
1 回答
643 浏览

c++ - 提升进程间共享互斥锁和提升共享互斥锁的进程间条件变量

Boost 版本 - 1.47 我找不到 boost::interprocess::interprocess_sharable_mutex,但它看起来像是前向声明的。这真的支持吗?

我可以看到 boost::interprocess::interprocess_upgradable_mutex 是前向声明的,它也被定义了。但是,我找不到可以使用此互斥锁的相应条件变量。有任何想法吗 ?

0 投票
2 回答
14678 浏览

python - threading.Condition 与 threading.Event

我还没有找到对模块中ConditionEvent类之间差异的清晰解释。threading是否有一个明确的用例,其中一个比另一个更有帮助?我能找到的所有示例都使用生产者-消费者模型作为示例,哪里queue.Queue是更直接的解决方案。

0 投票
3 回答
1772 浏览

c - 这种条件变量的使用是否总是会出现丢失信号的情况?

假设在信号线程修改影响谓词真值的状态并调用pthread_cond_signal而不持有与条件变量关联的互斥锁的情况下使用条件变量?这种类型的使用是否总是受制于可能错过信号的竞争条件?

对我来说,似乎总是有一个明显的种族:

  1. 服务员将谓词评估为假,但在它可以开始等待之前......
  2. 另一个线程以使谓词为真的方式更改状态。
  3. 另一个线程调用pthread_cond_signal,它什么也不做,因为还没有服务员。
  4. 服务员线程进入pthread_cond_wait,不知道谓词现在为真,并无限期地等待。

但是,如果情况发生变化,是否总是存在相同类型的竞争条件,以便(A)在调用时保持互斥锁,而pthread_cond_signal不是在更改状态时保持,或者(B)在更改状态时保持互斥锁,只是不是在打电话的时候pthread_cond_signal

我是从想知道上述非最佳实践用法是否有任何有效用途的角度来问的,即正确的条件变量实现是否需要在避免竞争条件本身时考虑这种用法,或者它是否可以忽略它们,因为它们本来就很活泼。

0 投票
2 回答
160 浏览

c - 条件变量的延迟 bcast 唤醒 - 它有效吗?

我正在实现 pthread 条件变量(基于 Linux futexes),并且我有一个想法来避免pthread_cond_broadcast进程共享条件变量的“踩踏效应”。对于非进程共享的 cond var,futex 重新排队操作传统上(即通过 NPTL)用于将等待者从 cond var 的 futex 重新排队到 mutex 的 futex 而不唤醒它们,但这对于进程共享的 cond var 通常是不可能的,因为pthread_cond_broadcast可能没有指向关联互斥体的有效指针。在最坏的情况下,互斥锁甚至可能不会映射到其内存空间中。

我克服这个问题的想法是pthread_cond_broadcast只直接唤醒一个服务员,并让该服务员在唤醒时执行重新排队操作,因为它确实具有指向互斥锁的所需指针。

如果我采用这种方法,自然有很多丑陋的竞争条件需要考虑,但是如果可以克服它们,是否还有其他原因导致这种实现无效或不受欢迎?我能想到的一个可能无法克服的潜在问题是负责重新排队的服务员(一个单独的进程)在它可以采取行动之前被杀死的竞争,但是通过放置 condvar 甚至可以克服这个问题futex 在健壮的互斥列表中,以便内核在进程死亡时对其执行唤醒。

0 投票
3 回答
776 浏览

c - 何时可以使用 cond var 同步其自身的销毁/取消映射?

根据 POSIX,

销毁当前没有线程阻塞的初始化条件变量应该是安全的。

此外,指定信号和广播操作以解除阻塞在条件变量上的一个/所有线程。

因此,在我看来,以下形式的自同步销毁应该是有效的,即调用pthread_cond_destroy

  1. 在一个成功的信号之后,在等待或信号线程中,恰好一个线程在 cond var 上被阻塞。
  2. 广播成功后立即在任何等待线程或广播线程中。

当然,这假设没有其他服务员到达,并且之后不会执行进一步的信号,应用程序负责保证如果使用pthread_cond_destroy.

我是否正确地认为破坏在这些情况下是有效的?还有其他关于条件变量的自同步销毁场景需要注意吗?

最后,对于在不破坏的情况下取消映射共享映射可能有意义的进程共享条件变量,是否可以合理预期取消映射在相同上下文中有效,破坏将有效,或者如果同一进程中有多个线程,则必须进一步同步(地址空间)正在使用相同的映射并希望在上述上下文之一中取消映射?

0 投票
4 回答
1628 浏览

c - 带有条件变量的简单生成器监控程序

我创建了一个简单的程序,它使用条件变量在两个线程之间创建同步。我得到一个奇怪的输出,我似乎找不到解决方案。

程序所做的是,在生成器线程中,生成 1000 个随机整数并检查它们是否是完全平方。如果该数字是一个完美的平方,那么它会向监视器线程发出信号,该线程打印该数字的平方根。

我遇到的问题很可能是某种竞争条件,因为当生成器发出信号时,监视器根本没有打印出平方根。

奇怪的是,当我在 gdb b 中调试时,每次变量is_square更改时单步执行,问题都不存在。

任何见解将不胜感激。我觉得这与我的互斥锁或条件放置有关。

0 投票
2 回答
7442 浏览

c++ - std::condition_variable 和 std::condition_variable_any 有什么区别?

我可能遗漏了一些明显的东西,但我看不出std::condition_variableand之间有什么区别std::condition_variable_any。为什么我们两者都需要?

0 投票
1 回答
28024 浏览

c++ - std::condition_variable 的 notify_all() 和 notify_one() 有什么区别?

目前,我正在使用std::threadC++11 实现一个多线程项目。我std::condition_variable用来同步线程。具体来说,一个消费者函数调用wait()成员函数std::condition_variable等待来自全局任务队列的任务,另一个生产者函数生成任务并将其放入队列。但我不知道 .notify_all()notify_one()成员函数之间的区别std::condition_variable。我应该在生产者函数中使用哪个函数?谢谢!

0 投票
0 回答
941 浏览

multithreading - 使用 boost 线程监控模式

作为 boost::thread 的新手,前几天我正在尝试编写一个 BlockingQueue(在我看来,这是有史以来最实用的同步构造)。这是使用信号量或条件变量完成的,以前在 Windows 和 linux 上都做过,但从未使用过 boost。

因此,在您可以使用“监视器”的语言中(您知道,具有锁定、等待和通知功能的语言)您只需使用它:

据我所知,“监视器”是使用 boost::condition_variable_any 和 boost::mutex 完成的。但是,condition_variable_any 已经包含一个互斥锁!(称为 internal_mutex)。所以这就是为什么我起初认为 condition_variable_any 是整个监视器,但事实证明互斥锁不能从外部访问,并且在等待之前不能锁定它等等。

任何人都知道 boost::condition_variable_any::internal_mutex 的目的是什么?就我而言,这让我很困惑,因为我知道等待 pthread_cond_t 必须在互斥锁锁定的情况下完成 - 但是哪个互斥锁?谢谢。