我std::thread在我的C++代码中使用一个不断轮询一些数据并将其添加到缓冲区.我使用a C++ lambda来启动这样的线程:
StartMyThread() {
thread_running = true;
the_thread = std::thread { [this] {
while(thread_running) {
GetData();
}
}};
}
Run Code Online (Sandbox Code Playgroud)
thread_running 是atomic<bool>在类头中声明的.这是我的GetData功能:
GetData() {
//Some heavy logic
}
Run Code Online (Sandbox Code Playgroud)
接下来我还有一个StopMyThread函数,我将其设置thread_running为false,以便它退出while中的while循环lambda block.
StopMyThread() {
thread_running = false;
the_thread.join();
}
Run Code Online (Sandbox Code Playgroud)
据我了解,我可以暂停和使用恢复该线程std::condition_variable的指出这里在我前面的问题.
但是,如果我只是使用std::atomic<bool> thread_running执行或不执行GetData()下面的逻辑,是否有缺点?
GetData() {
if (thread_running == false)
return;
//Some heavy logic
}
Run Code Online (Sandbox Code Playgroud)
与使用 …
我正在开发一个粗略的 Arduino 模拟器。它的主要功能应该是测试由控制结构、循环、开关和子程序组成的简单代码。
我的主要想法是自己简单地提供 Arduino 库的功能,例如像digitalWrite()or 之类的功能digitalRead(),它可以从外部应用程序(如虚拟面包板)读取和发送引脚状态。
下图显示了我目前的概念。模拟器基本上是一个线程,它执行setup()一次函数,然后开始执行loop()函数直到停止。它可以从控制(主)线程停止或暂停。
setup()和loop()函数的实现,以及一些变量,由用户提供,不能修改或访问。
到现在为止还挺好。现在我想要模拟中断。当模拟器线程正在执行loop()函数时,外部应用程序会触发一个中断。这应该导致中断处理程序的执行isr(),它也由用户提供并且不能更改。
我有两种不同的方法来解决这个问题:
这两种方法都有自己的问题。对于第一个,我需要以某种方式同步状态,这似乎更像是一个可怕的黑客。对于第二个选项,据我所知,我无法指定哪个线程将执行信号处理程序。
如果可能,解决方案应该与平台无关。但是,该解决方案绝对需要在Windows(MinGW甚至Cygwin)下编译和运行。