【发布时间】:2014-12-18 10:44:51
【问题描述】:
我需要在 C++ 程序中并行化一些任务,并且对并行编程完全陌生。到目前为止,我通过互联网搜索取得了一些进展,但现在有点卡住了。我想在循环中重用一些线程,但显然不知道该怎么做。
我正在从计算机上的两个ADC卡采集数据(并行采集),那么我需要在采集下一批数据的同时对采集到的数据(并行处理)进行一些操作。这里有一些伪代码来说明
//Acquire some data, wait for all the data to be acquired before proceeding
std::thread acq1(AcquireData, boardHandle1, memoryAddress1a);
std::thread acq2(AcquireData, boardHandle2, memoryAddress2a);
acq1.join();
acq2.join();
while(user doesn't interrupt)
{
//Process first batch of data while acquiring new data
std::thread proc1(ProcessData,memoryAddress1a);
std::thread proc2(ProcessData,memoryAddress2a);
acq1(AcquireData, boardHandle1, memoryAddress1b);
acq2(AcquireData, boardHandle2, memoryAddress2b);
acq1.join();
acq2.join();
proc1.join();
proc2.join();
/*Proceed in this manner, alternating which memory address
is written to and being processed until the user interrupts the program.*/
}
这就是它的主要内容。循环的下一次运行将在处理“b”数据时写入“a”内存地址并继续交替(我可以让代码执行此操作,只是将其取出以防止问题混乱)。
无论如何,问题(我相信有些人已经知道了)是我第二次尝试使用 acq1 和 acq2 时,编译器 (VS2012) 说“IntelliSense:调用没有适当的 operator() 或将函数转换为指向函数类型的指针”。同样,如果我再次将 std::thread 放在 acq1 和 acq2 前面,它会显示“错误 C2374:'acq1':重新定义;多重初始化”。
所以问题是,我可以在线程完成之前的任务后将它们重新分配给新任务吗?我总是在再次调用之前等待线程的先前使用结束,但我不知道如何重新分配线程,并且由于它处于循环中,我无法每次都创建一个新线程(或者如果我可以,这似乎是浪费和不必要的,但我可能弄错了)。
提前致谢
【问题讨论】:
标签: c++ multithreading loops reusability