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

C频繁暂停和重启线程的最佳方式是什么?

翟新
2023-03-14

我有一个可以很好地并行化的任务,所以我想使用多个线程来加速我的程序。但是,这并不像创建线程并让它们运行那么简单。线程必须重复执行某个任务,中间有中断,即伪代码如下所示:

loop
  wake threads up
  calculate x using the threads
  pause threads
  calculate something else without the threads

这种情况非常频繁,准确地说是每秒60次。这就是为什么每次创建新线程都太慢了。我尝试用每个线程的状态变量(运行、暂停、停止)以及带有条件变量的类似事件的构造或轮询机制来解决这个问题。

这两个都只给了我大约两倍的速度,这并不像我想象的那样快,考虑到只有大约5%的时间花在关键部分内。(我的CPU提供4核*2=8超线程)

我可以想象,条件变量的问题是,唤醒不是立即的,而是有一些延迟,这意味着运行时被浪费了。轮询方法稍微慢一点,因为我猜,线程暂停时执行的代码会更慢,因为线程仍在使用CPU。

实现我心中所想的最好方法是什么?

共有2个答案

仲孙善
2023-03-14

你可以使用英特尔TBB。如果你的任务足够简单,你可以使用一种简单的算法,比如parallel\u for。(parallel_for使用lambas更容易:https://software.intel.com/en-us/blogs/2009/08/03/parallel_for-is-easier-with-lambdas-intel-threading-building-blocks)

范书
2023-03-14

如果您希望线程阻塞直到发生某些事情,您可以将std::互斥锁(其锁由st持有d::unique_lock

您使用std::c成员,将std::unique_lock

 类似资料:
  • 本文向大家介绍C#程序暂停线程,包括了C#程序暂停线程的使用技巧和注意事项,需要的朋友参考一下 要在C#中暂停线程,请使用方法。 您需要设置线程要暂停的毫秒数,例如5秒钟,请使用- 示例 让我们看看如何循环并设置sleep方法来暂停线程。 输出结果

  • 在WPF应用程序中,我有一个线程池(每个线程都是对返回base 64映像的REST webservice的调用),我想精确地“控制”这些线程。 这些线程是异步的,我希望能够暂停/恢复它们中的每一个。 > < li> 我想使用CancellationToken之类的东西不是一个选项,因为每个线程都只是进行一次调用并等待响应。 我只是在课堂线程中看到的= 如果有人有什么建议呢? 提前谢谢。

  • 我们的 BigQuery 模式是大量嵌套/重复的,并且不断变化。例如,网站的新页面、表单或用户信息字段将与 BigQuery 中的新列相对应。此外,如果我们停止使用某种形式,相应的弃用列将永远存在,因为您无法删除Bigquery中的列。 因此,我们最终将生成包含数百列的表,其中许多列已被弃用,这似乎不是一个好的解决方案。 我正在研究的主要替代方案是将所有内容都存储为json(例如,每个Bigque

  • 可能重复: 查找字符串中最长的重复序列 我正在解决一个问题,我需要找到重复最多的模式。 为了简单和方便,请考虑这个字符串: 重复次数最多的序列(例如,最初考虑字符串长度大于3个字符)是“Lorem Ipsum”。“Lorem”和“Ipsum”当然也重复相同的次数,但如果它们重复相同的次数,则较长的字符串优先于较短的字符串。 什么样的算法可以有效地找到这种模式,最好是在Python中?

  • 可能重复: Java等待并通知:IllegalMonitorStateException 有什么问题 投掷:

  • 当onPause发生时,我的线程没有停止,导致“线程已启动”logcat错误onResume,因为我无法运行两个线程实例。此时如何终止线程?我认为我需要做一些事情,比如: 但是我不能把它添加到我的气球基本暂停中,我认为上下文是错误的。所以请帮忙,代码如下所示。(代码示例会很有帮助,谢谢) 我的活动: 我的表面视图: 我的线程:公共类 GameLoopThreadBasic 扩展线程 { 私有游戏视