相关疑难解决方法(0)

使用std :: atomic比较std :: condition_variable wrt在C++中暂停和恢复std :: thread的方法

这是一个单独的问题,但与我在此的上一个问题有关

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_runningatomic<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)

与使用 …

c++ c++11 stdthread stdatomic

6
推荐指数
1
解决办法
630
查看次数

在 C++11 中模拟类似 Arduino 的中断

我正在开发一个粗略的 Arduino 模拟器。它的主要功能应该是测试由控制结构、循环、开关和子程序组成的简单代码。

我的主要想法是自己简单地提供 Arduino 库的功能,例如像digitalWrite()or 之类的功能digitalRead(),它可以从外部应用程序(如虚拟面包板)读取和发送引脚状态。

下图显示了我目前的概念。模拟器基本上是一个线程,它执行setup()一次函数,然后开始执行loop()函数直到停止。它可以从控制(主)线程停止或暂停。

在此处输入图片说明

setup()loop()函数的实现,以及一些变量,由用户提供,不能修改或访问。

到现在为止还挺好。现在我想要模拟中断。当模拟器线程正在执行loop()函数时,外部应用程序会触发一个中断。这应该导致中断处理程序的执行isr(),它也由用户提供并且不能更改。

我有两种不同的方法来解决这个问题:

  1. 暂停模拟器线程,在不同的线程中执行中断处理程序并恢复模拟器线程。
  2. 改用信号处理程序,在发生中断时向进程发送信号。

这两种方法都有自己的问题。对于第一个,我需要以某种方式同步状态,这似乎更像是一个可怕的黑客。对于第二个选项,据我所知,我无法指定哪个线程将执行信号处理程序。

如果可能,解决方案应该与平台无关。但是,该解决方案绝对需要在Windows(MinGW甚至Cygwin)下编译和运行

c++ windows simulation arduino interrupt

6
推荐指数
1
解决办法
208
查看次数

标签 统计

c++ ×2

arduino ×1

c++11 ×1

interrupt ×1

simulation ×1

stdatomic ×1

stdthread ×1

windows ×1