Мой код:
while (DAQ is ON) {
do stuff on vars;
if(f(vars) > thr)
update vars;
}
Условие if будет вызвано только изредка и будет обновлять все переменные, используемые в предыдущем разделе цикла while. Общий цикл обычно работает в режиме реального времени (по мере необходимости), но отстает, когда условие if также необходимо запустить. Как я могу запустить условие if в отдельном потоке? Это может занять все время, когда это необходимо, это нормально, если обновление происходит после задержки. Я просто хочу, чтобы остальная часть цикла while работала в реальном времени и чтобы vars обновлялся всякий раз, когда поток "if" завершается.
Контекст: структура C++/JUCE, обработка сигналов в реальном времени.
Я предполагаю, что у вас есть как минимум 2 ядра для работы здесь. В противном случае многопоточность вам не поможет, если вообще. Я использую семантику многопоточности С++ 11 здесь, поэтому вы должны включить спецификации языка С++ 11 в своем компиляторе:
#include <condition_variable>
#include <thread>
#include <mutex>
using namespace std;
condition_variable cv;
mutex mtx;
bool ready = false;
void update_vars() {
while( true ) {
// Get a unique lock on the mutex
unique_lock<mutex> lck(mtx);
// Wait on the condition variable
while( !ready ) cv.await( mtx );
// When we get here, the condition variable has been triggered and we hold the mutex
// Do non-threadsafe stuff
ready = false;
// Do threadsafe stuff
}
}
void do_stuff() {
while( true ) {
// Do stuff on vars
if ( f(vars) ) {
// Lock the mutex associated with the condition variable
unique_lock<mutex> lck(mtx);
// Let the other thread know we're ready for it
ready = true;
// and signal the condition variable
cv.signal_all();
}
while( ready ) {
// Active wait while update_vars does non-threadsafe stuff
}
}
}
int main() {
thread t( update_vars );
do_stuff()
}
То, что делает вышеприведенный фрагмент кода, создает дополнительный поток, на котором выполняются обновления vars, которые будут зависать и ждать, пока основной поток (работает do_stuff) не передаст его через переменную условия.
PS, возможно, вы также можете сделать это с помощью фьючерсов, но я не работал с теми, кто достаточно, чтобы отвечать на их основе.
f(vars)
или обновление? Если бы вы заменилиf(vars)
на создание копииvars
, это было бы достаточно быстро?