C++11中的异步IO

Asynchronous IO in C++11

本文关键字:IO 异步 C++11      更新时间:2023-10-16

我需要运行一些迭代算法,我不知道它是否会在合理的时间内收敛到所需的精度。因此,如果我可以在每次迭代后打印残差,并且一旦我感到满意/失去耐心,我可以告诉程序将当前解决方案写入磁盘并终止,那将是很酷的。

通常,为了实现这一点,程序必须在每次迭代后询问是否现在应该终止,大多数时候我不得不告诉它不要终止。这显然很烦人。我不能告诉程序运行,直到我按下某个键,一旦我这样做,它应该完成当前迭代,将近似值写入磁盘并终止吗?

是的,你可以,甚至可以只使用标准的C++11功能。诀窍是生成一个新线程,该线程的唯一工作就是侦听std::cin。一旦用户写了任何东西,监听线程就会设置一个标志,告诉工作线程中止。在下面的小示例中,我使用这种技术实现了一个"秒表"。

#include <iostream>
#include <thread>
#include <atomic>
int main() {
    std::atomic<bool> abort(false);
    std::thread t([&abort] () {
        std::cout << "Abort?";
        std::cin.peek();
        abort = true;
    });
    unsigned long i = 0;
    while (!abort) ++i;
    t.join();
    std::cout << "Counted to " << i << std::endl;
    return 0;
}

您现在可以尝试在程序达到100000000时终止程序。:-)