在 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::cin
或 std::cout
但不能同时两者,因此您需要更改算法以避免此问题。
代码:
#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::cin
或 std::cout
但不能同时两者,因此您需要更改算法以避免此问题。