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

c++ - 你如何在一个类的不同实例之间共享一个互斥锁?

我想知道如何在另一个类的不同实例中共享一个类中的互斥锁。

现在,我有一个类 Indexer,它有一个 Boost mutex 和 condition_variable 作为私有成员变量。我在 main 中创建了 Indexer 类的 auto_ptr,并将 Indexer 的指针传递给另一个类 Robot 的实例。

我这样做如下:

机器人的构造函数是:

机器人的标题看起来像:

但是,由于互斥锁是不可复制的,我得到一个错误。

我正在考虑制作互斥锁和条件变量 shared_ptrs 但我读到这可能会导致意外行为。

有人可以告诉我正确/正确的方法吗?

谢谢!

0 投票
6 回答
42158 浏览

multithreading - 什么时候需要条件变量,互斥量还不够吗?

我确信互斥锁是不够的,这就是条件变量概念存在的原因;但它打败了我,当条件变量必不可少时,我无法用具体的场景说服自己。

条件变量、互斥锁和锁之间的差异问题的接受答案说条件变量是

用“信号”机制锁定。当线程需要等待资源可用时使用它。线程可以在 CV 上“等待”,然后资源生产者可以“向”变量发出“信号”,在这种情况下,等待 CV 的线程会收到通知并可以继续执行

我感到困惑的是,一个线程也可以在互斥体上等待,当它收到信号时,仅仅意味着该变量现在可用,为什么我需要一个条件变量?

PS:另外,无论如何,都需要一个互斥锁来保护条件变量,这让我的视线更加偏向于看不到条件变量的目的。

0 投票
1 回答
5349 浏览

c - C中的Boss Worker Pthreads Web服务器-如果发送的请求多于线程数,服务器将崩溃

我正在使用 Pthreads(我更讨厌)用 C 语言(我很讨厌)编写一个 Web 服务器,但我被困在了这一点上。服务器的模型是boss-worker,因此boss线程在程序开始时实例化所有工作线程。有一个全局队列存储传入连接的套接字。老板线程是在接受连接时将所有项目(套接字)添加到队列中的线程。然后,所有工作线程等待将一个项目添加到全局队列中,以便它们开始处理。

只要我连接到它的次数少于服务器拥有的工作线程数,服务器就可以正常工作。因此,我认为要么是我的互斥体有问题(可能信号丢失了?),要么线程在运行一次后被禁用(这可以解释为什么如果有 8 个线程,它只能解析第一个8 个 http 请求)。

这是我的全局队列变量。

这是主线。它使用入队、出队、空等方法创建一个队列结构(在别处定义)。当服务器接受连接时,它将传入连接所在的套接字入队。一开始调度的工作线程不断检查这个队列,看是否添加了任何作业,如果有作业,则它们将套接字出列,连接到该端口,并读取/解析/写入传入的 http 请求.

这是工作线程。这应该始终运行检查新请求(通过查看队列是否为空)。在这个方法结束时,它应该推迟回到老板线程以等待下一次需要它。

任何帮助将不胜感激。如果有人需要,我可以发布更多代码,请告诉我。我不是最擅长操作系统的东西,尤其是在 C 语言中,但我知道互斥锁的基础知识,cond。变量、信号量等。就像我说的,我会尽我所能获得帮助。(另外,我不确定我是否完全正确地发布了代码,因为这是我的第一个问题。让我知道是否应该更改格式以使其更具可读性。)

谢谢!

0 投票
1 回答
833 浏览

c - pthread_mutex_lock() 可以在 pthread_cond_wait() 解除阻塞之前解除阻塞吗?

想象一个线程阻塞在条件变量上:

互斥锁被解锁,另一个试图锁定互斥锁的线程被解锁:

同时还有另一个线程等待获取临界区的所有权:

现在,问题是:当调用 pthread_cond_signal() 时,是否保证 pthread_cond_wait() [1] 会在 pthread_mutex_lock() [2] 之前解除阻塞?

POSIX 规范似乎对此案只字未提。

0 投票
2 回答
2403 浏览

windows - Windows上的递归互斥锁?

据我了解,在 Windows 上 CRITICAL_SECTION 只能用作非递归互斥锁。要获得递归互斥锁,您必须使用 OpenMutex 和朋友。

但是,AFAIU、Win32 Mutex 不能与条件变量一起使用(InitializeConditionVariable 等)

有没有办法在 Windows 上将递归互斥锁与条件变量结合使用?

0 投票
1 回答
1772 浏览

c++ - boost::condition_variable::notify_one() 上的并发

我有一个异步处理任务的“引擎”,对于一个任务,我想等到该任务处理完毕。

问题是上面的代码有一个竞争条件。如果DoWorkAsync()通知boost::condition_variable之前DoSomeWork()等待呢?

我看到它boost::condition_variable::wait有第二个参数,一个布尔值,可以用来实现这样的东西

但并发性仍然存在......我该如何解决这个问题?

0 投票
1 回答
215 浏览

c++ - 是否可以使用与 2 个互斥锁关联的 1 个条件变量(单独)

我想问一下是否可以使用与 2 个互斥锁关联的 1 个条件变量来进行 2 种数据更新。

基本上,我有thread1和thread2。Thread1 可以等待 2 种数据更新,所以它有 2 个互斥锁,每个互斥锁一个。(我知道我可以对所有这些数据使用一个互斥锁,但这不是这个问题的重点,对吗?)而且我当然不希望它在 data1 上等待 data2 已经可用,所以它只有 1 个条件变量. 而thread2 将同时提供data1 和data2。问题是在thread2中,我不知道thread1现在是在等待data1还是data2,还是根本不等待。

伪代码如下所示:

外界会调用 func1 或 func2 来更新数据。当func1或func2被调用时,它会发信号cond_var,无论是在lock1还是lock2。cond_var 的等待没有被 while 包围,所以如果 cond_var 在 lock1 上被唤醒,但 data2 可用,thread1 会继续处理 data2。

实际的实现是通过 boost::thread,由于我的测试平台是 Linux,所以 boost::thread 应该通过 pthread 实现。

在我阅读的几乎所有关于条件变量的教程和文档中,它只与 1 个互斥锁相关联。所以我很想知道上面的程序是否可以使用,或者根本上存在缺陷。

0 投票
3 回答
4899 浏览

c++ - 在条件变量上调用通知时,互斥锁是否会解锁?

我试图了解在条件变量中使用互斥锁时会发生什么。

在以下示例中,取自cppreference

生产者线程cond_var.notify_one()在互斥锁解锁之前调用。调用 notify 时互斥锁是否m解锁,还是仅在互斥锁解锁时才出现通知?

0 投票
4 回答
10964 浏览

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

我使用的参考通过以下方式解释了这两者:

  • wait_for“阻塞当前线程,直到条件变量被唤醒或在指定的超时持续时间之后”

  • wait_until“阻塞当前线程,直到条件变量被唤醒或到达指定的时间点”

有什么不同?将wait_until自旋,以便线程在收到信号时可以准确地(或多或少地)继续,而wait_for只是在那时将线程重新添加到调度中?

0 投票
1 回答
103 浏览

multithreading - 多个线程但只允许使用一个方法

所以基本上我所处的情况是我有一堆线程,每个线程在一周内都在做不同的计算。在一周结束时,每个线程调用函数 X() 然后开始计算下一周并重复此循环。

但是,只允许一个线程实际执行方法 X() 中的操作,并且只有当所有线程都到达方法 X() 时。此外,在使用方法 X() 的一个线程完成之前,没有一个线程可以继续前进。

所以我很难实现这一点。我觉得我需要使用条件变量,但我仍然对线程和诸如此类的东西感到不安。