gpt4 book ai didi

c++ - 如何有条件地同时多线程和更新变量?

转载 作者:行者123 更新时间:2023-11-28 02:41:34 26 4
gpt4 key购买 nike

我的代码是:

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

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

上下文:C++/JUCE 框架,实时信号处理。

最佳答案

我假设您至少有 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()
}

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

PS,你可能也可以用 futures 来做这个,但我还没有足够的工作来根据这些来回答。

关于c++ - 如何有条件地同时多线程和更新变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25799316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com