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

c++ - C++ 中条件变量的常见用途是什么?

我正在尝试了解条件变量。我想知道使用条件变量的常见情况是什么。

一个例子是在一个阻塞队列中,两个线程访问队列——生产者线程将一个项目推入队列,而消费者线程从队列中弹出一个项目。如果队列为空,则消费者线程一直在等待,直到生产者线程发送信号。

还有哪些其他需要使用条件变量的设计情况?

不过,我更喜欢基于经验的示例,例如真实应用程序中的示例。

0 投票
1 回答
4031 浏览

c++ - 如果您以原子方式更改检查值,条件变量是否仍需要互斥锁?

以下是使用条件变量的典型方法:

但是,如果 protected_by_mutex_var 是通过比较和交换指令原子设置的,那么互斥锁是否有任何用途(除了 pthread 和其他 API 要求您传入互斥锁)?是用来实现条件的保护状态吗?如果不是,那么这样做是否安全?:

作者从不直接与读者的互斥锁交互?请注意,“protected_by_mutex_var”名称不再合适(不再受互斥保护)。如果是这样,不同的读者是否有必要使用相同的互斥锁?

0 投票
2 回答
410 浏览

concurrency - 为什么条件变量有时会错误地唤醒?

我已经知道你使用条件变量的方式是

因为有时条件变量会自发唤醒。但我一直不明白为什么会这样。在过去,我读过制作一个没有这种行为的条件变量很昂贵,但仅此而已。

那么......为什么您需要担心在等待条件变量时被错误地唤醒?

0 投票
10 回答
83579 浏览

c - 为什么 pthread 的条件变量函数需要互斥锁?

我正在阅读pthread.h;条件变量相关函数(如pthread_cond_wait(3))需要互斥体作为参数。为什么?据我所知,我将创建一个互斥锁仅用作该参数?那个互斥锁应该做什么?

0 投票
1 回答
522 浏览

c++ - 如何使用 pthread 和条件变量改善多线程应用程序中的实时行为?

我有一个使用 pthreads 的多线程应用程序。我有一个互斥锁()锁和条件变量()。有两个线程,一个线程正在为第二个线程(一个工作线程)生成数据,该线程正在尝试以实时方式处理生成的数据,以便在尽可能接近固定时间段过去的情况下处理一个卡盘。

这工作得很好,然而,偶尔当生产者线程释放工作者正在等待的条件时,在工作者线程获得控制权并再次执行之前,会出现长达近一秒的延迟。

我知道这一点,因为在生产者释放工人正在等待的条件之前,如果是时候处理另一个卡盘,它会为工人做一个卡盘处理,然后在工作线程中接收到条件后,它也会立即执行如果是时候加工另一个夹头,则加工一个夹头。

在后一种情况下,我看到我处理卡盘很多次都晚了。我想消除这种损失的效率,并尽我所能保持卡盘的滴答声尽可能接近所需的频率。

我能做些什么来减少生产者的释放条件与检测到该条件已释放以使工作人员恢复处理之间的延迟吗?例如,生产者调用某些东西来强制自己切换上下文是否会有所帮助?

底线是工人必须等待每次它要求生产者为自己创建工作,以便生产者可以在告诉工人它准备好再次并行运行之前与工人的数据结构混淆。生产者的独占访问时间很短,但在此期间,我也在检查生产者代表工人完成的实时工作,而生产者具有独占访问权限。不知何故,我的手重新回到并行运行,偶尔会导致我想避免的显着延迟。请建议如何最好地实现这一点。

0 投票
3 回答
461 浏览

c++ - 如何多线程这个?

我希望有两个线程。第一个 thread1 偶尔会调用以下伪函数:

第二个 thread2 永远处于以下伪循环中:

编写此代码的最佳方法是什么,以使 thread1 和 thread2 在具有多核的机器上尽可能保持忙碌。我想避免一个线程的通知和另一个线程的检测之间的长时间延迟。我尝试使用 pthread 条件变量,但发现线程 2 执行“通知线程 1 我很忙”与 thear2IsExclusive() 上的 waitForThread2() 中的循环之间的延迟可能长达近一秒。然后我尝试使用 volatile sig_atomic_t 共享变量来控制它,但是出了点问题,所以我一定没有正确地做。

0 投票
3 回答
1606 浏览

c - C编程中的并发线程

我在多个线程上实现等待和信号条件时遇到了问题。

线程需要锁定互斥体并等待条件变量,直到其他线程发出信号。同时,另一个线程锁定同一个互斥体并等待同一个条件变量。现在,在整个过程中同时运行的线程向条件变量发出信号,但我只希望必须向第一个等待的线程发出信号,而不是其他线程。

0 投票
2 回答
1798 浏览

boost - Boost condition_variable 参数错误

我在下面的代码中遇到错误。

导致此错误的原因是什么?

0 投票
1 回答
1530 浏览

multithreading - 在 win32 中使用条件变量 API 唤醒多个线程的问题

我在理解 winapi 条件变量如何工作时遇到问题。

在更具体的方面,我想要的是几个线程在某些条件下等待。然后我想使用 WakeAllConditionVariable() 调用来唤醒所有线程,以便它们可以工作。除了我只想启动线程这一事实之外,它们没有任何其他先决条件可以开始工作(就像您在 n 生产者/ n 消费者场景中那样)。

这是到目前为止的代码:

主线程:

这是线程例程的代码:

这段代码没有做我期望它做的事情。有时只有一个线程完成工作,有时两个或三个,但绝不会全部完成。主函数永远不会通过 WaitForMultipleObjects() 调用。

我不确定我做错了什么,但我会在某处假设一些同步问题?

任何帮助,将不胜感激。(对不起,如果我用不同的着装重新发布了旧主题:)

0 投票
1 回答
548 浏览

java - 多线程代码和条件变量使用

一段多线程代码异步访问资源(例如:文件系统)。

为此,我将使用条件变量。假设FileSystem是这样的接口:

我现在有一个应用程序访问FileSystem. readFile()假设我可以通过一个方法发出多次读取。该操作应将数据写入传递给它的字节缓冲区。

这是使用条件变量的正确方法吗?会readFile()马上回来吗?

(我知道使用锁进行读取有些愚蠢,但写入文件也是一种选择。)