如何在C++; 我在C++中做了一个多线程应用程序。 特别是,在输入操作中涉及到一个辅助线程,问题是std::cin是一条阻塞指令,这会在我的程序的执行流中产生一些问题。 如果主线程结束其执行,次线程也应该这样做,但它在std::cin上被阻塞,所以用户必须插入一些东西让程序结束。 有可能克服这个问题吗

如何在C++; 我在C++中做了一个多线程应用程序。 特别是,在输入操作中涉及到一个辅助线程,问题是std::cin是一条阻塞指令,这会在我的程序的执行流中产生一些问题。 如果主线程结束其执行,次线程也应该这样做,但它在std::cin上被阻塞,所以用户必须插入一些东西让程序结束。 有可能克服这个问题吗,c++,multithreading,cin,blocking,C++,Multithreading,Cin,Blocking,代码如下: #include <iostream> #include <future> #include <string> #include <chrono> #include <thread> #include <atomic> std::atomic<bool> interrupt(false); std::string get_input(){ std::cout << "I

代码如下:

#include <iostream>
#include <future>
#include <string>
#include <chrono>
#include <thread>
#include <atomic>

std::atomic<bool> interrupt(false);

std::string get_input(){

  std::cout << "Insert a new command: ";
  std::string cmd;
  std::cin >> cmd;
  return cmd;

  }

void kill_main_thread(){

  std::this_thread::sleep_for(std::chrono::milliseconds(5000));
  interrupt = true;

  }

int main() {

  std::thread new_thread (kill_main_thread);     // spawn new thread that calls foo()


  while(1) {

      if ( interrupt ) {
          return 0;
      }

      std::future<std::string> fut = std::async(get_input);
      if ( fut.wait_for(std::chrono::seconds(500)) == std::future_status::timeout ){

          std::string cmd = fut.get();

            
           if ( cmd == "close") std::cout << "close command\n";
            else if ( cmd == "open") std::cout << "open command\n";
            else  std::cout << "not recognized command\n";

      }

  }
return 0;
  
}
但std::cin上的次线程仍然被阻塞


我还尝试使用conio.h库的getch()函数创建一个非阻塞输入函数来替换std::cin,但首先我的应用程序应该优先处理不同的操作系统和辅助操作,它会导致控制台管理出现问题,因为我需要用这种方式改变我的程序的每一个STD::/P> >在标准C++中没有用于非阻塞输入的工具。任何解决方案都必须是特定于平台的。那么您可以更具体一点吗?我的应用程序应该可以在Windows和Unix操作系统上运行,这样我就可以分别管理这两种情况了。您已经看过ncurses了吗?这是我第一次建议我看到ncurses只在Unix机器上工作,对吗?在本例中,我应该在Windows和Linux上的ncurses上使用conio.h,主要问题是我必须通过相应的输出函数更改所有std::cout,将ncurses端口更改为多个平台,包括Windows(不是认可,我自己没有使用过,只是通过快速搜索找到)在标准C++中没有用于非阻塞输入的工具。任何解决方案都必须是特定于平台的。那么您可以更具体一点吗?我的应用程序应该可以在Windows和Unix操作系统上运行,这样我就可以分别管理这两种情况了。您已经看过ncurses了吗?这是我第一次建议我看到ncurses只在Unix机器上工作,对吗?在本例中,我应该在Windows上使用conio.h,在Linux上使用ncurses,主要问题是我必须通过相应的输出函数更改所有std::cout,将ncurses端口更改为多个平台,包括Windows(不是认可,我自己没有使用过,只是通过快速搜索找到)。
    void kill_main_thread(){
      ...
      ...
      std::istringstream iss;
      std::cin.rdbuf(iss);

     }