Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用C+中的单独线程读取标准DIN+;_C++_Multithreading_Stdin - Fatal编程技术网

C++ 用C+中的单独线程读取标准DIN+;

C++ 用C+中的单独线程读取标准DIN+;,c++,multithreading,stdin,C++,Multithreading,Stdin,我试图在主程序运行搜索算法的同时获得一个单独的线程来读取stdin。理想情况下,它应该设置一些主线程可以读取的停止/退出标志 我目前拥有以下代码: void COMM::listen_for_input(bool stopset, long long stoptime) { std::string input = ""; while (!stopset || getTimeMs() < stoptime) { input = "

我试图在主程序运行搜索算法的同时获得一个单独的线程来读取stdin。理想情况下,它应该设置一些主线程可以读取的停止/退出标志

我目前拥有以下代码:

void COMM::listen_for_input(bool stopset, long long stoptime) {
    std::string input = "";

    while (!stopset || getTimeMs() < stoptime) {
        input = "";
        std::getline(std::cin, input);


        if (input.find("quit") != std::string::npos) {
            ld.quit = true;
            return;
        }
    
        if (input.find("stop") != std::string::npos) {
            ld.stop = true;
            return;
        }

        if ((stopset && getTimeMs() >= stoptime) || Search::isStop.load(std::memory_order_relaxed)) {
            return;
        }

    }
}
我的问题是listener.join()调用只是等待函数listen\u for\u input()实际读取“stop”或“quit”。我已经通过调试器检查了搜索程序线程是否正确连接,以及程序是否在调用listener.join()时只是等待。这意味着它们由于超时而停止(使用与getTimeMs()>=stoptime相同的逻辑),这意味着该线程应该能够执行相同的操作。。。此外,我还检查了它的“停止”和“退出”是否正确;除非给出其中一个,否则它不会加入

我做错了什么导致while循环永远不会终止?使用单独的线程在stdin上侦听输入的最佳方式是什么


提前感谢:)

listener.detach()而不是
listener.join()?我很难理解你的问题。我的问题是,我想让一个线程在主线程同时运行一个算法的同时,侦听来自stdin的输入。然后,主线程应该能够查看是否有来自用户/gui的“停止”或“退出”命令(程序通常由gui控制)。我将尝试listener.detatch()
std::thread listener(COMM::listen_for_input, info->timeset, info->stoptime);

/*  Run the main thread  */

listener.join();