我有一个功能可以归结为:
while(doWork)
{
config = generateConfigurationForTesting();
result = executeWork(config);
doWork = isDone(result);
}
假设所有函数都是线程安全的,独立于先前的迭代,并且可能需要比允许的最大线程数更多的迭代,我该如何重写它以实现高效的异步执行?
这里的问题是我们不知道提前需要多少次迭代,所以我们不能制作 adispatch_group
或使用dispatch_apply
.
这是我的第一次尝试,但由于任意选择的值和睡眠对我来说看起来有点难看;
int thread_count = 0;
bool doWork = true;
int max_threads = 20; // arbitrarily chosen number
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
while(doWork)
{
if(thread_count < max_threads)
{
dispatch_async(queue, ^{ Config myconfig = generateConfigurationForTesting();
Result myresult = executeWork();
dispatch_async(queue, checkResult(myresult)); });
thread_count++;
}
else
usleep(100); // don't consume too much CPU
}
void checkResult(Result value)
{
if(value == good) doWork = false;
thread_count--;
}