代碼:
#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 << "輸入" << i 1 << " 元素。"。
flag2 = start(2, arr i) 。
if (flag2 == 0)
{
cout << endl;
break;
}
count ;
}
cout << endl
<< "陣列元素。"。
for (int i = 0; i < count; i )
{
cout << *(arr i) << " "/span>;
}
int temp;
cout << "
輸入臨時值。"。
cingt;> temp;
cout << "這是你輸入的內容。" << temp;
return 0;
}
輸出:
輸入1元素。5
輸入2元素。2元素:2
輸入3元素。6 6
輸入4元素。8 元素。
輸入5元素。
陣列元素。5 2 6 8
輸入臨時值。7
在拋出一個'std::system_error'的實體后終止呼叫
what()。 沒有這樣的行程
預期輸出:
輸入1元素。5
輸入2元素。2元素:2
輸入3元素。6 6
輸入4元素。8 元素。
輸入5元素。
陣列元素。5 2 6 8
輸入臨時值。7
這是你的輸入內容。7
代碼概述: 上面的代碼從用戶那里獲取陣列輸入,直到用戶想要停止,就像我想從用戶那里獲取無限的輸入,對于鏈接的串列/堆疊/佇列,我知道陣列有固定的大小,但我的問題不是獲取無限的輸入,那是正常的,我使用兩個執行緒,一個執行緒(計時器t2)用于計數秒(在這個例子中是2秒),另一個執行緒(輸入t1)用于獲取用戶的輸入。當用戶完成輸入后,他只需要等待2秒,執行緒t2將脫離執行緒t1,現在問題來了。
問題: 直到第59行,一切都很正常,但是當我試圖為'temp'輸入時,一個例外發生了,在拋出一個'std::system_error'what()的實體后終止了呼叫。 沒有這樣的行程。正如我之前所說的,我從用戶那里獲取指標并在該地址存盤數值。但是,當用戶停止輸入,執行緒t2分離了t1,然后代碼恢復,直到這里都沒有問題,但是執行緒t1中cin的輸入仍然不完整,它需要一個輸入,因此當我給'temp'輸入時,它把它當作我之前在執行緒t1中的輸入,而執行緒t2沒有接受輸入就分離了,我想,由于該執行緒不再與主執行緒相連,這個例外出現了。
有什么辦法可以解決這個問題嗎? 我嘗試了很多,但都失敗了,請查看我的代碼。
如果有任何幫助,我們將不勝感激。
uj5u.com熱心網友回復:
在你的案例中,你應該使用跨執行緒的原子共享變數。
std::cin是阻塞性操作。在你的代碼中,兩秒后為執行緒1做detach。但是std::cin仍然在等待輸入...
控制臺視窗可以std::cin或std::cout但不能同時進行,所以你需要改變演算法來避免這個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/331105.html
標籤:
上一篇:計算45度,指向頁面的左上角
