在 C++ 中分离该线程后使用 cin 获取输入时出现问题

Problem while taking input using cin after detaching that thread in C++

代码:

#include <iostream>
#include <windows.h>
#include <thread>

using namespace std;

int input(int time, int *ptr)
{
    int sec = 0, flag = 0;
    thread t1([&]()
            {
                cin >> *ptr;
                sec = 0;
                flag = 1;
                t1.detach();
            });
    thread t2([&]()
            {
                while (flag == 0)
                {
                    if (sec == time)
                    {
                        if (t1.joinable())
                        {
                            t1.detach();
                        }
                        break;
                    }
                    Sleep(1000);
                    sec++;
                }
            });
    t2.join();
    return flag;
}
int start(int time, int *ptr)
{
    return input(time, ptr);
}
int main()
{
    int arr[10], flag2 = 1, count = 0;
    for (int i = 0; i < 10; i++)
    {
        cout << "Enter " << i + 1 << " element: ";
        flag2 = start(2, arr + i);
        if (flag2 == 0)
        {
            cout << endl;
            break;
        }
        count++;
    }
    cout << endl
        << "Array elements: ";
    for (int i = 0; i < count; i++)
    {
        cout << *(arr + i) << " ";
    }
    int temp;
    cout << "\nEnter temporary value: ";

    cin >> temp;
    cout << "Here is what you gave as input: " << temp;
    return 0;
}

输出:

Enter 1 element: 5
Enter 2 element: 2
Enter 3 element: 6
Enter 4 element: 8
Enter 5 element:

Array elements: 5 2 6 8
Enter temporary value: 7
terminate called after throwing an instance of 'std::system_error'
  what():  No such process

预期输出:

Enter 1 element: 5
Enter 2 element: 2
Enter 3 element: 6
Enter 4 element: 8
Enter 5 element:

Array elements: 5 2 6 8
Enter temporary value: 7
Here is what you gave as input: 7

代码概览: 上面的代码从用户那里获取数组输入,直到用户想要停止,就像我想从用户那里获取无限输入,对于链接 list/stack/queue,我知道数组具有固定大小,但我的问题不在于获取无限输入,那工作正常,我使用两个线程一个线程(计时器 t2)来计算秒数(在本例中为 2 秒),另一个线程(输入 t1)从用户那里获取输入。当用户完成输入后,他只需要等待 2 秒,线程 t2 就会分离线程 t1,现在问题来了。

问题: 直到第 59 行一切正常,但是当我尝试为 'temp' 获取输入时发生异常,在抛出 'std::system_error' what() 的实例后终止调用:没有这样的过程。正如我之前关于我的代码所说的那样,我从用户那里获取指针并将值存储在该地址。但是,当用户停止提供输入并且线程 t2 分离 t1 时,然后代码恢复,直到这里没问题但是线程 t1 中的 cin 输入仍然不完整,它需要输入,因此当我为 'temp' 提供输入时它需要它对于我之前在线程 t1 中的输入,它被线程 t2 分离而没有接受输入,我认为,由于该线程不再附加到主线程,所以出现了这个异常。

有什么解决办法吗? 我尝试了很多但都失败了,请检查我的代码。

如有任何帮助,我们将不胜感激。

在您的情况下,您应该跨线程使用原子共享变量。 std::cin 是阻塞操作。两秒钟后在您的代码中为 thread1 执行分离。但是 std::cin 仍在等待输入... 控制台 window 可以 std::cinstd::cout 但不能同时两者,因此您需要更改算法以避免此问题。