我有一個函式,我想在另一個函式中運行它,所以我擁有的主函式有一個 while 回圈運行,而外面的另一個函式也有一個 while 回圈,我想同時運行這兩個函式,而不會互相中斷其他,
所以主函式將保持其主 while 回圈和其他函式正常運行。
我希望它在后臺作為執行緒運行,但只在 IF 陳述句內部運行,它也是一個 while 回圈,只有當這個 IF 陳述句為 TRUE 時,它才會啟動執行緒,并且也會在主回圈函式運行時運行我將在這里展示問題舉例:
void MatchChecker()
{
while (1)
{
if (g_pOBJ->checkInMatch() == 2)
{
std::cout << "In Match! " << std::endl;
}
}
void mainFunc()
{
while (1)
{
if (checkIngame() == true) {
std::thread checker(MatchChecker);
checker.join();
break;
}
}
while (1)
{
std::cout << "Im doing some stuff here in this main loop" << std::endl;
someOtherThread.join();
}
}
所以主要問題是checker.join();當我在 if 中添加它時,第二個回圈沒有開始并且它卡在 mainchecker 回圈中,我不能把它checker.join放在另一個回圈里面,因為它沒有定義,所以我能做什么解決我的問題?有什么建議?
uj5u.com熱心網友回復:
如果您想同時運行 2 個執行緒,但假設其中一個執行緒的執行受條件限制,您可以執行以下操作:
- 將執行受條件約束的任務作為異步任務運行。這樣,您可以為該任務宣告一個未來,然后檢查該未來是否有效(即,是否為該未來創建了一個任務)。
- 在普通執行緒中運行另一個(另一個異步任務也可以)。
這樣,您可以等待您mainFunc的任務/執行緒完成(get在未來和join執行緒上)。演示
#include <iostream> // cout
#include <future> // async
#include <thread>
void f() { for (auto i{0}; i < 10000; i) std::cout << "a\n"; }
void g() { for (auto i{0}; i < 10000; i) std::cout << "b\n"; }
int main()
{
std::future<void> fut{};
if (0) // 0 just for testing; your condition would come here
{
fut = std::async(std::launch::async, f);
}
std::thread t_g(g);
t_g.join();
if (fut.valid())
{
fut.get();
}
}
uj5u.com熱心網友回復:
ITNOA
您可以像下面這樣更改代碼
void MatchChecker()
{
while (1)
{
if (g_pOBJ->checkInMatch() == 2)
{
std::cout << "In Match! " << std::endl;
}
}
void mainFunc()
{
std::thread checker;
while (1)
{
if (checkIngame() == true) {
checker = std::thread(MatchChecker);
break;
}
}
while (1)
{
std::cout << "Im doing some stuff here in this main loop" << std::endl;
someOtherThread.join();
}
if (checker.joinable())
checker.join();
}
在上面的代碼中,我通過定義空執行緒將執行緒定義和運行分開,并在需要時啟動。
為了優雅地加入執行緒,在函式的最后我檢查執行緒是否joinable可以加入,如果它是可連接的,我會嘗試join它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331739.html
上一篇:C 2D演算法代碼讀取陣列錯誤
下一篇:在一個模板定義中使用兩種型別
