【问题标题】:Asynchronous console input froze previous input C异步控制台输入冻结了先前的输入 C
【发布时间】:2016-04-22 06:04:18
【问题描述】:

我想用 3 个线程(main、reader、writer)编写简单的程序。阅读器线程是这样的:

char message[128];
while (1) {
    std::cin >> message;
}

主线程捕获Ctrl+Z 动作,然后用户按下此控件,然后我想显示像Do you want finish? (Y/N) __ 这样的简单选择,其中__std::cin 动作。现在我有类似的东西:

void signal_handler(int signal) {
    char finish;
    std::cout << "Do you want finish? (Y/N)";
    std::cin >> finish;
}

int main(void) {
    signal(20, signal_handler);
    ...

但是当我最初发送简单的Y 时会转到阅读器线程,现在当我发送Y 时会转到主线程。如何将标准输入重定向到主线程?

【问题讨论】:

  • 您在信号处理程序中做的太多了,只需设置一个由您的程序检查的标志。也没有硬编码信号编号,而是使用名称。
  • 什么是“C之前”中的“C”?
  • @UlrichEckhardt 对不起,我的错。我的英语很差:
  • 但是现在的“C”是什么意思呢?如果您指的是语言,那么您的语言是 C++,而且,它应该是一个标签,而不是标题的一部分。

标签: c++ multithreading stdin


【解决方案1】:

标准 IO(std::cin 包装)不支持线程。

您的多线程应用程序有责任以合理的方式处理其资源。

做到这一点的一种方法是让一个线程负责读取 STDIN 并推送到由一些多线程感知抽象代码控制的内存队列。然后根据程序逻辑的要求将该资源“锁定”到所需的线程。

【讨论】:

    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多