当前位置: 首页 > 知识库问答 >
问题:

如何定期同步线程?

仲孙宇定
2023-03-14

在不消耗太多cpu的情况下,我无法定期同步多个线程。

我有一个主线程和几个计算线程,它们都以以下形式出现:

CalcThread()   // x N threads
{
  loop{
    - do some calc stuff (variable but finite duration).
    - wait until main thread give a "continue" signal.
  }
}

MainThread()
{
  loop{
    - wait for all calc threads to be in waiting state.
    - do some calc synthesis stuff.
    - send a "continue" signal to calc threads.
  }
}

目前,我让我的线程等待彼此循环std::this_thread::yield()指令,并在原子共享标志上设置一些条件。它可以工作,但是这些循环非常消耗CPU。

必须有另一个解决方案,可能是使用互斥和条件变量,但我是新手,我所有的尝试都会导致失败。。。

有人有主意吗?谢谢你的帮助。

共有1个答案

李博达
2023-03-14

条件变量正是您想要的。让您的计算线程使用std::condition_variable::wait阻止它们,直到主线程唤醒它们。让主线程调用std::condition_variable::notify_all来取消阻止所有计算线程。

 类似资料:
  • 问题内容: 我一直在尝试解决涉及使用wait()和notify()的线程通信的问题。基本上我有2个线程T1和T2,我希望它们按以下顺序执行 T1,T2,T1,T2 .....我该如何实现? 实际的问题:有两个线程T1-打印奇数(例如1-100),而T2-打印偶数(1-100)。现在,输出应为1,2,3,4,5,.... 100 问题答案: 您描述了生产者-消费者模式。 它是Java的实现,在许多J

  • 本文向大家介绍C# 中如何实现线程同步?相关面试题,主要包含被问及C# 中如何实现线程同步?时的应答技巧和注意事项,需要的朋友参考一下 (1)方法一:阻塞(调用Sleep()或Join()) (2)方法二:加互斥锁lock (3)方法三:信号和句柄(AutoResetEvent/ManualResetEvent,调用Set()和WaitOne())    

  • 我有多个线程,它们都从一个对象运行。我希望“主线程”单独运行,直到某一点,然后它等待,所有其他线程一起运行,然后主线程唤醒,等等。。。。。我无法同步线程。我要么得到一个非法的监视器状态异常,要么它卡在一个“等待”循环中,该循环应该接收一个永远不会到达的“通知”。 更具体地说,我有一个带有数组的对象。阵列中的每个单元都有一个线程,该线程检查相邻单元,然后使用该信息更改其单元。为了有序地进行更改,我希

  • 下面的代码创建了一个新的custom um < code > Thread ,并等待线程结束,直到主线程再次激活。 > < li >我不太明白它是如何工作的。为什么< code > myth read . wait();立即接到电话? < li> 为什么不改用< code>Thread.join()? 公共静态void main(String[] args) {

  • 所以我有一个代码: 所以我将线程添加到我的线程列表中,然后启动这些线程。这是MyThread类: 我想做一个程序来创建线程,将它们添加到列表中,调用它们,但是每个线程都应该等到前一个线程结束它的任务。因此输出应该如下所示: 如何使用实现这一点?我尝试了使用的不同方法,但失败了。

  • 互斥锁 条件变量 POSIX信号量