我需要在C++程序中并行处理一些任务,但我对并行编程完全不熟悉。目前通过互联网搜索已经有了一些进展,但现在卡住了。我想在循环中重用一些线程,但显然不知道如何实现我想要的功能。
我正在从计算机上的两个ADC卡获取数据(并行获取),然后需要对收集到的数据执行一些操作(并行处理),同时收集下一批数据。以下是一些伪代码以说明问题。
那就是它的主旨。循环的下一次运行将在处理“b”数据时写入“a”内存地址,并继续交替进行(我可以让代码这样做,只是为了防止问题混乱而将其删除)。
无论如何,问题(我相信有些人已经可以看出来了)是第二次尝试使用acq1和acq2时,编译器(VS2012)会提示“IntelliSense:调用类类型的对象时缺少适当的operator()或转换函数为指向函数类型的指针”。同样,如果我再次在acq1和acq2前面放置std::thread,它会说“错误C2374:'acq1':重新定义;多重初始化”。
因此,问题是,当线程完成其先前的任务后,我是否可以将线程重新分配给新任务?我总是等待线程的上一个使用结束,然后再次调用它,但我不知道如何重新分配线程,并且由于它在一个循环中,我不能每次都创建一个新线程(或者如果我可以,那似乎是浪费和不必要的,但我可能是错的)。
提前感谢您的回答。
我正在从计算机上的两个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()或转换函数为指向函数类型的指针”。同样,如果我再次在acq1和acq2前面放置std::thread,它会说“错误C2374:'acq1':重新定义;多重初始化”。
因此,问题是,当线程完成其先前的任务后,我是否可以将线程重新分配给新任务?我总是等待线程的上一个使用结束,然后再次调用它,但我不知道如何重新分配线程,并且由于它在一个循环中,我不能每次都创建一个新线程(或者如果我可以,那似乎是浪费和不必要的,但我可能是错的)。
提前感谢您的回答。
doJob
方法中,当你调用condVar_.notify_one()
时,锁会在之前(或者在之前)被释放吗?我问这个问题的原因是因为我的直觉告诉我,可能会在通知的线程唤醒之前,尝试获取锁并在执行doJob
的线程实际释放锁之前失败。 - David