【问题标题】:Is there any method to abort cin or scanf有什么方法可以中止 cin 或 scanf
【发布时间】:2020-01-15 10:21:02
【问题描述】:

我有一个多线程程序,其中一个线程通过终端等待输入,另一个将从套接字获取数据。有什么方法可以中止第一个线程 cin/scanf 从第二个线程打印控制台数据。

我想杀死第一个线程,从第二个线程打印数据然后再次运行第一个线程。但我正在寻找一种更好的方法,比如 abort cin 然后重新唤醒它。

void thread1(){
    cin>>string;
    doSomething();
}
void thread2(){
    cout<<getSomeData();
} 

在通常情况下,它不会打印数据,直到从键盘输入内容。

[编辑]

我找到了一个特殊的解决方案,比如如果它没有得到输入就会中断,一切都是用 C 风格完成的。 无论如何,如果您有兴趣,请查看“Head First C”一书,“进程间通信:谈话很好”部分。

【问题讨论】:

  • 不,通过标准库函数的输入是阻塞的,没有标准(从 C 或 C++ 角度)中断它们的方式。如果您想要“可中断”输入,那么您需要转向操作系统并使用某种非阻塞输入机制,或轮询输入(和中断)。
  • 发送信号可用于中断阻塞系统调用。我不知道std::cin 的实现如何处理这个问题,即它是重新启动,还是以失败/错误状态返回。
  • 没有标准的 C++ 方式,但可能是特定于平台的方式。你的平台是什么?
  • Raspberry pi3 与 raspbian

标签: c++ multithreading io


【解决方案1】:

我不知道以下解决方案是否足够标准,但它适用于我的 Fedora Linux (GCC 10.3) 和 Windows 10 (MSVC 16.11)

#include <iostream>
#include <csignal>

int main()
{
    std::signal(SIGINT, [] (int s)
    {
        std::signal(s, SIG_DFL);
        std::fclose(stdin);
        std::cin.setstate(std::ios::badbit); // To differenciate from EOF input
    });

    std::string input;
    std::cout << "Input CTRL+C or EOF now!" << std::endl;
    std::getline(std::cin, input);

    std::cout << (std::cin.bad() ? "\rinterrupted" : "eof") << std::endl;
}

不要问我现在如何从那个状态重用cin

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 2017-06-02
    • 1970-01-01
    • 2014-05-22
    • 2015-01-28
    • 2022-06-15
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多