0

我的代码是:

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

if 条件只会偶尔触发,并且会更新 while 循环前面部分中使用的所有变量。整个循环通常是实时运行的(根据需要),但是当 if 条件也需要运行时就会落后。如何在单独的线程中运行 if 条件?它可能需要它需要的所有时间,如果更新在延迟之后发生,那也没关系。我只希望while循环的其余部分实时运行,并且只要“if”线程完成,vars就会得到更新。

背景:C++/JUCE 框架,实时信号处理。

4

1 回答 1

2

我假设您在这里至少有 2 个内核可以使用。否则,多线程不会对您有太大帮助,如果有的话。我在这里使用 C++11 多线程语义,因此您将在编译器中启用 C++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()
}

上面的代码片段所做的是创建一个运行 update vars 的辅助线程,它将挂起并等待,直到主线程(运行 do_stuff)通过条件变量向它发出信号。

PS,您可能也可以对期货进行此操作,但我尚未与那些足以根据这些回答的人合作。

于 2014-09-12T02:42:45.117 回答