- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个程序需要每次迭代运行一个函数 M 次,并且这些运行可以并行化。假设我一次只能运行 N 个线程(比如可用内核数)。我需要一种算法来确保我始终运行 N 个线程(只要剩余线程数 >= N)并且该算法需要对这些线程的完成顺序保持不变。此外,线程调度算法不应占用大量 CPU 时间。
我有类似下面的想法,但它显然有缺陷。
#include <iostream>
#include <pthread.h>
#include <cstdlib>
void *find_num(void* arg)
{
double num = rand();
for(double q=0; 1; q++)
if(num == q)
{
std::cout << "\n--";
return 0;
}
}
int main ()
{
srand(0);
const int N = 2;
pthread_t threads [N];
for(int q=0; q<N; q++)
pthread_create(&threads [q], NULL, find_num, NULL);
int M = 30;
int launched=N;
int finnished=0;
while(1)
{
for(int w=0; w<N; w++)
{
//inefficient if `threads [1]` done before `threads [2]`
pthread_join( threads [w], NULL);
finnished++;
std::cout << "\n" << finnished;
if(finnished == M)
break;
if(launched < M)
{
pthread_create(&threads [w], NULL, find_num, NULL);
launched++;
}
}
if(finnished == M)
break;
}
}
这里明显的问题是,如果 threads[1]
在 threads[0]
之前完成,就会浪费 CPU 时间,我想不出如何获取围绕那个。另外,我假设让主例程等待 pthread_join()
不会显着消耗 CPU 时间?
最佳答案
我建议不要重新生成线程,这是相当严重的开销。相反,创建一个包含 N 个线程的池并通过工作队列向它们提交工作,这是一种相当标准的方法。即使您的剩余工作少于 N,额外的线程也不会造成任何伤害,它们只会在工作队列中阻塞。
如果您坚持当前的方法,您可以这样做:
不要等待带有 pthread_join
的线程,你不需要它,因为你没有将任何东西传回主线程。创建具有属性 PTHREAD_CREATE_DETACHED
的线程让他们退出。
在主线程中,等待信号量,每个退出的线程都会发出信号 - 实际上您会等待任何线程终止。如果你没有<semaphore.h>
出于任何原因,使用互斥锁和条件来实现它都是微不足道的。
#include <semaphore.h>
#include <iostream>
#include <pthread.h>
#include <cstdlib>
sem_t exit_sem;
void *find_num(void* arg)
{
double num = rand();
for(double q=0; 1; q++)
if(num == q)
{
std::cout << "\n--";
return 0;
}
/* Tell the main thread we have exited. */
sem_post (&exit_sem);
return NULL;
}
int main ()
{
srand(0);
/* Initialize pocess private semaphore with 0 initial count. */
sem_init (&exit_sem, 0, 0);
const int N = 2;
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
for(int q=0; q<N; q++)
pthread_create(NULL, &attr, find_num, NULL);
int M = 30;
int launched=N;
int finnished=0;
while(1)
{
for(int w=0; w<N; w++)
{
/* Wait for any thread to exit, don't care which. */
sem_wait (&exit_sem);
finnished++;
std::cout << "\n" << finnished;
if(finnished == M)
break;
if(launched < M)
{
pthread_create(NULL, &attr, find_num, NULL);
launched++;
}
}
if(finnished == M)
break;
}
}
无论如何,我会再次推荐线程池/工作队列方法。
关于C++ P线程 : Algorithm to run N threads simultaneously when >N threads must be run each iteration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7963778/
此函数返回一个 2 元组,其中包含列表的最小值和最大值: import Control.Arrow ((***), (>>>), (&&&)) import Data.Semigroup (getMi
我有两个 Java 进程,Processor 和 Simulator。 模拟器每5秒向File X写入规定的数据记录(10行文本)。 处理器不断读取该文件,等待 token 指示有效记录。代码是这样的
我有两个不同的应用程序必须协同工作。进程 1 作为时间源,进程 2 根据进程 1 提供的时间源执行操作。我需要运行进程 2 的多个副本。目标是让一个时间源进程同时向 5-10 个其他进程发出信号时间,
在我的 Backbone.js 应用程序中,我有以下模型和 View : var Operation = Backbone.Model.extend({ defaults: function(
请大家帮忙,这很重要。 我需要在不到 5 分钟的时间内下载大约 2000 张图像。所以我决定进行并行图片下载。 如果有人可以建议我进行并行下载的更好方法或告诉我哪里出错了,我将不胜感激。 在错误日志中
当我阅读 Clojure 代码(比如来自 GitHub 上的各个项目)时,有一些东西我不太理解:在 :require 表达式中,你应该使用 :as 当您仅使用您使用 :refer 引用的函数时?另外,
我在多个客户端连接的客户端服务器聊天程序的客户端实现上遇到问题。问题是我遇到的问题是我应该如何同时发送(聊天消息到另一个客户端)和接收(来自另一个客户端的聊天消息)?发生的情况是我总是发送数据但从不读
我有两个列表: List listA1 = GetFirstList(); List listA2 = GetSecondList(); 和A类定义 class A { public int
我使用了两个图像(img_heart_1 和 img_heart_2)。我有两种动画,一种是平移动画,另一种是缩放 text_anim.xml: animi(Animation),bounce_up.
考虑我有一个如下所示的运行方法,我正在尝试为 MyThread 创建四个线程。语句 1 到 3 可以由线程同时运行,也可以不同地运行。但是我想让Statement 4同时被线程执行。我可以在语句 4
对于新因素感到抱歉,但我正在阅读有关 mysql 的“太多连接”。 http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html m
我正在尝试自定义约束 菜单栏类: import UIKit class ManuBar: UIView { override init(frame: CGRect) { sup
我正在使用尚未为 Swift 4 做好准备的第 3 方库,即打破独占内存访问规则 ( SE-0176)。 因此,我的控制台充满了这些警告: Simultaneous accesses to 0xb1a
我需要调用一堆 *.exe,这样我就可以调用一个记事本文件,其中存储了所有要调用的 *.exe 的所有完整路径,并使用该记事本文件(可以编辑)我想创建一个调用列表的父 exe,其中存在所有子 *.ex
我正在尝试制作一个具有单个服务器和多个客户端场景的客户端服务器聊天应用程序。我的服务器正在工作,但我无法让客户端工作。我正在使用 select() 函数来选择我应该 recv() 还是 send()。
我正在尝试为类似 Pokemon 的游戏编写一个 AI,除了所有的 Action 都事先为两个玩家所知(所有玩家都可以看到)。我已经记录了我需要的所有信息,例如伤害、准确度、暴击率等。 我以为我的目标
假设账户ABC(fund:1000) 发生一笔6000 的取款交易,同时从ATM 取款8000。那么交易将如何管理。数据库是否只打开一个连接并且不允许新连接到同一帐户?? .... 在这种情况下,当交
我一直在尝试将视频(来自我的网络摄像头)同时输出到文件('out.mkv')和管道: 文件获取过滤帧,管道:获取未过滤的原始视频。 我的帧速率是 30 fps。但是,我的文件输出中的帧速率要低得多。
我们需要在一台PC上驱动8到12个显示器,所有显示器都呈现单个3D场景图的不同 View ,因此必须使用多个图形卡。我们目前正在dx9上运行,因此希望移至dx11,以期使此操作变得更容易。 初步调查似
我想以编程方式同时不在XML文件中显示两个动画,它应该 ROTATE和TRANSLATE 我怎样才能做到这一点? 请以某种方式建议我?????? 这是ma代码:> ImageView snowImg1
我是一名优秀的程序员,十分优秀!