Как я могу условно многопоточными и обновлять переменные одновременно?

0

Мой код:

while (DAQ is ON) {
do stuff on vars;
if(f(vars) > thr)
update vars;
}

Условие if будет вызвано только изредка и будет обновлять все переменные, используемые в предыдущем разделе цикла while. Общий цикл обычно работает в режиме реального времени (по мере необходимости), но отстает, когда условие if также необходимо запустить. Как я могу запустить условие if в отдельном потоке? Это может занять все время, когда это необходимо, это нормально, если обновление происходит после задержки. Я просто хочу, чтобы остальная часть цикла while работала в реальном времени и чтобы vars обновлялся всякий раз, когда поток "if" завершается.

Контекст: структура C++/JUCE, обработка сигналов в реальном времени.

  • 1
    Это проблема f(vars) или обновление? Если бы вы заменили f(vars) на создание копии vars , это было бы достаточно быстро?
  • 0
    Нет шагов обновления внутри, если есть проблема. Когда выполняется условие if, оно удваивает время, затрачиваемое циклом. Обновление включает в себя множество матричных и векторных операций. «F (Vars)» было просто обозначение. Я хочу сказать, что параметр, полученный из переменных, имеет пороговое значение.
Теги:
multithreading
thread-safety
juce
inter-process-communicat

1 ответ

2

Я предполагаю, что у вас есть как минимум 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, возможно, вы также можете сделать это с помощью фьючерсов, но я не работал с теми, кто достаточно, чтобы отвечать на их основе.

  • 0
    Предполагая, что потоку обновления требуется доступ к некоторым данным, созданным «основным» потоком, потребуется больше, не так ли?
  • 0
    Якк, это рамки. Может потребоваться дополнительная синхронизация, в зависимости от семантики do_stuff () и update_vars (). Например, update_vars () может потребоваться скопировать переменные во временную область, манипулировать ими, сообщить основному потоку, что он готов обновить переменные, дождаться, пока основной поток покажет, что он готов к новой информации, скопировать информацию обратно и сообщите основному потоку, что новая информация готова.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню