问题标签 [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 回答
8765 浏览

c++ - 使用 std::mutex、std::condition_variable 和 std::unique_lock

我在理解条件变量及其与互斥锁的使用方面遇到了一些麻烦,我希望社区可以帮助我。请注意,我来自 win32 背景,所以我与 CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject 等一起使用。

这是我第一次尝试使用 c++11 标准库进行并发,它是此处找到的程序示例的修改版本。

关于这个的几个问题。

我读过“任何打算等待 std::condition_variable 的线程必须首先获取一个 std::unique_lock 。”

所以我有一个 {quit mutex, condition variable & bool} 来指示何时发出退出信号。生产者和消费者线程必须分别获取一个 std::unique_lock ,如下所示:

这让我很困惑。这不会将退出互斥锁锁定在第一个线程中,从而阻塞第二个线程吗?如果这是真的,那么第一个线程如何释放锁,以便另一个线程可以开始?

另一个问题:如果我将 wait_for() 调用更改为等待零秒,则该线程将被饿死。有人可以解释吗?我希望它在执行 while 循环之前不会阻塞(我是否正确假设 no_timeout 是recv'd 而不是超时?)。

如何调用 wait_for() 并指定零时间,以便 wait_for() 调用不会阻塞,而只是检查条件并继续?

我也很想听听关于这个主题的好的参考资料。

0 投票
2 回答
185 浏览

synchronization - 条件变量信号

在此处的此链接中,在增量函数中,条件变量在实际增加计数(从零开始)之前发出信号。增加计数后是否不应该调用信号?或者,直到在 increment_function 中释放互斥锁后,decrement_count 函数中的等待调用才会返回?

0 投票
1 回答
1445 浏览

c++ - 在 Visual Studio 2012 中使用嵌套的 std::async 和 std::condition_variable

我已经有了Worker类和一个Handler类来为工作创建一个抽象层。我想用std::async一些异步来混合,但我的 Visual Studio 2012(更新 1)出现了一些奇怪的行为。

我的类层次结构如下:

  • Worker是一个具有纯虚方法的抽象类InitWork
  • BasicWorker : Worker只是printf用于一些输出。
  • GroupWorker : Worker是其他工作人员的聚合。
  • Handler坚持Worker做一些工作。

然后我调用几个std::async方法,在其中创建工作程序和处理程序,在嵌套std::async调用中调用处理程序,等待工作程序的初始化(std::condition_variable此处),然后停止处理程序。

最后,我等待所有的std::futures 完成。

代码如下:

我的问题是:

  • 如果我取消注释函数中的行,WaitForInit@GroupWorker那么在进行所有第一级异步函数调用之前,不会进行嵌套的异步函数调用
  • 在等待std::condition_variable我增加作业数量时,新线程的创建感觉就像成倍地变慢。对于我的试验,低于 100 个工作存在一些异步,但超过 300 个则完全按顺序创建工作。
  • 然后,如果我取消注释方法中的printfStart,所有嵌套的异步都会像魅力一样工作

所以,

  • 我在使用中做错了std::condition_variable什么?
  • 为什么为 100 多个线程创建作业会变慢?(这个问题是可选的,似乎是操作系统的问题,可以用智能线程池概念来解决)
  • printf和这些有什么关系?(我尝试printf在竞争条件下删除所有调用,我在代码中放置了一个断点但没有帮助。情况std::cout也是如此)

编辑:我添加了启动策略(由 Jonathan Wakely 建议)以确保创建线程。但这也无济于事。我目前正在创建一个std::thread并调用thread::join函数以在第一级异步中等待。

0 投票
2 回答
848 浏览

c - 没有人在等待时发出条件变量信号的意义?

在阅读一本关于并发的书时,作者说信号量与 signal() 工作方式中的条件变量不同。信号量会跟踪对 signal() 的调用次数,而条件变量则不会。“在没有人等待的情况下调用 pthread_cond_signal 无效”,它说。为什么这个细节很重要(我已经看到它在不同的地方重复了很多次)?对使用有什么影响?谢谢

0 投票
2 回答
3221 浏览

c++ - 在 VS2012 中使用 C++11 条件变量

在一个简单的 VS2012 控制台应用程序中,我无法让代码可靠地工作,该应用程序由使用 C++11 条件变量的生产者和消费者组成。我的目标是生成一个小的可靠程序(用作更复杂程序的基础),它使用 3 个参数 wait_for 方法或我在这些网站上收集的代码中的 wait_until 方法:

条件变量: wait_forwait_until

我想将 3 个参数 wait_for 与如下所示的谓词一起使用,但它需要使用类成员变量才能在以后对我最有用。仅运行大约一分钟后,我收到“访问冲突写入位置 0x_ _ ”或“无效参数已传递给服务或函数”作为错误。

stable_clock 和 2 参数 wait_until 是否足以替换 3 参数 wait_for?我也试过这个没有成功。

有人可以展示如何让下面的代码无限期地运行而没有错误或奇怪的行为,无论是从夏令时更改挂钟时间还是互联网时间同步?

指向可靠示例代码的链接可能同样有帮助。

Visual Studio Desktop Express 安装了 1 个重要更新,而 Windows Update 没有其他重要更新。我正在使用 Windows 7 32 位。

0 投票
3 回答
15736 浏览

c++ - 当调用具有条件变量等待的线程对象的析构函数时会发生什么?

我正在使用 aSynchronisedQueue在线程之间进行通信。我发现当附加线程正在等待条件变量时销毁线程对象会导致程序崩溃。这可以通过detach()在线程销毁之前调用来纠正。但我想知道当等待条件变量的线程终止时会发生什么。还有另一种使用条件变量的方法来避免这种情况吗?

0 投票
1 回答
134 浏览

c - 条件变量 - 意外行为

我试图让我的程序做到这一点:

  • 接受输入:nrNodes NrWorkers
  • 3个线程(工作者)一次只能访问列表(读取),但只有1个可以写入。
  • 当 5 个节点已完成(sqrt 值)时,它应该停止并让在链表中清除所有已完成节点的更清洁线程,而不是将访问权返回给剩余的有工作的线程

    Thread1: 获取 semaphoreSlot(); 工作; 如果条件完成发送信号;直到列表被解析;

    Thread2:等待信号;干净的; 返回对thread1的访问;

    清理后:遇到问题;停止,不退出;

代码 :

PS:它有效 ./s 1 1 ./s 1 4 ./s 4 4 ./s 4 1

调用清洁器后失败:当 x >= 5 时,它在 ./sxn 处失败

0 投票
1 回答
919 浏览

task - TBB 需要 condition_variable 用于任务同步

我正在将 tbb 用于某些项目,并且我被迫使用 tbb 任务。

我的程序有 N 个任务,它们是交互的。

伪代码如下:

N >> 核心

如果我为此作业使用 condition_variable,则线程停止并且线程停止所有任务。有什么方法可以用来完成我的工作吗?

我试图使用回收,但只有 CORE_NUMBER 任务在工作,其他 N-CORE_NUMBER 任务永远不会开始执行。

此致,

戈兰

0 投票
1 回答
394 浏览

pthreads - 需要关于 pthread 同步的建议/建议(结合使用条件变量和屏障)

我有以下情况:

我把一个任务分成几个阶段,每个阶段有几个线程做实际的工作,后期的线程需要等待当前阶段的所有线程完成。

例如:

线程 1、2、3 正在执行第一步中的工作

线程 4、5、6 正在执行第二步中的工作

线程 7、8、9 正在执行第三步……

每个步骤中的线程都是独立的,但它们需要等待上一步中的线程完成。

这是我想要实现的方法:

  1. 在当前步骤的每个线程中,等待表示当前步骤是否可以启动的条件
  2. 一旦可以开始当前步骤,所有线程都开始工作,并在屏障上等待此步骤中的所有线程完成
  3. 此步骤中的所有线程完成后,在下一步线程正在等待的条件变量上广播

这有意义吗?这里有什么明显的错误吗?

我被多线程程序的高级语言结构宠坏了,使用 pthread API 对我来说很痛苦。在这里,我需要一些关于此用例中最佳实践的建议?非常感谢

0 投票
2 回答
355 浏览

c++ - 使用 boost::thread 发生的线程锁。我的条件变量有什么问题?

我编写了一个 Link 类,用于在网络中的两个节点之间传递数据。我用两个双端队列实现了它(一个用于从节点 0 到节点 1 的数据,另一个用于从节点 1 到节点 0 的数据)。我正在尝试对应用程序进行多线程处理,但我遇到了线程锁。我试图防止同时读取和写入同一个双端队列。在阅读有关我最初如何实现此功能的更多信息时,我认为我错误地使用了条件变量(也许不应该使用布尔变量?)。我应该有两个互斥锁,每个双端队列一个吗?如果可以的话请帮忙。谢谢!

push_back 函数:

获取函数:

这是初始化(以防万一)