- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我今天才开始使用标准库深入研究多线程。以下是我到目前为止的想法。虽然原则上它是有效的,但它不会在一个线程完成后启动一个新线程,而是在最后 4 个线程完成后启动 4 个线程,因此如果任务花费的时间不相等,效率就不是很高。此外,如果他们没有按正确的顺序完成,他们必须等待后续工作完成,直到他们的结果得到评估。
我怎样才能实现始终拥有 4 个线程(直到工作用完)?我认为你需要使用某种观察者功能,但我不明白没有信号/插槽是如何可能的。如果您能给我指出正确的在线手册,我也很高兴。
此外,由于我在今天之前没有使用多处理的经验,请告诉我我可能在哪里使用了错误的做法。
提前致谢!
穆斯洛
这是线程任务:
void burn_task(MyClass* obj)
{
//computationally intensive
obj->burn();
}
它的名字是这样的:
void getsStuffDone()
{
//initialise everything
int samples = 1000;
int num_threads = 4;
std::vector<MyClass*> myclasslist;
std::vector<std::thread*> threadlist;
myclasslist.resize(num_threads);
threadlist.resize(num_threads);
int i = 0;
//do the work
while(i+1<samples)
{
//current_num_threads = min(num_threads, num_tasks_left)
int current_num_threads = (samples-i-1>num_threads)? num_threads : samples-i-1;
//create threads
for(int t=0; t<current_num_threads; ++t)
{
myclasslist[t] = new MyClass(other_parameters,i+1); //i+1 so seed is never zero
threadlist[t] = new std::thread(burn_task, myclasslist[t]);
++i;
}
//wait to finish, evaluate and clean up (delete)
for(int t=0; t<current_num_threads; ++t)
{
threadlist[t]->join();
useResultsContainedWithin(myclasslist[t])
delete myclasslist[t];
delete threadlist[t];
}
threadlist.clear();
}
}
最佳答案
处理一组执行某些任务的线程的常用方法是启动 X 个线程,然后让每个线程从公共(public)队列中选择它的“工作”。在一个非常简单的情况下,您只需简单地,而不是做 i+1
和 i++
在创建线程的循环中,让i
成为std::atomic<int>
,并做:
void some_thread_function()
{
for(;;)
{
int work_on = i.fetch_add(1); // "work_on = i++;"
if (work_on >= samples)
break;
... // do actual work
}
}
在更复杂的情况下,您会有一个可等待队列,其中包含更复杂的数据类型来描述要完成的“工作”。
这意味着您始终拥有“正确”数量的线程,并且没有创建/拆除线程的开销(如果线程运行了相当长的一段时间(十分之一秒或更长时间),这不是问题无论如何,但对于“短”运行时间来说,这很可能是一个因素。
关于c++ - 我怎样才能确保始终有给定数量的线程? (此外,这是线程的良好用法吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19144570/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!