簡體   English   中英

C ++ 17 std :: async非阻塞執行

[英]C++17 std::async non blocking execution

我創建了這個C ++ 17代碼來模仿我需要的東西。

std::cout << "start" << std::endl;

auto a = std::async([]() -> int {
    std::this_thread::sleep_for(std::chrono::seconds{ 5 });
    return 2;
});
std::cout << a.get() << std::endl;

std::cout << "stop" << std::endl;

線程在這里睡覺,但在實際示例中,我進行了大量操作,並且返回了可以為0、1或7的整數。這是我的輸出:

start
2
stop

很好! 此代碼不會凍結我的UI。 我知道a.get()是一個阻止操作,但是有沒有一種方法可以阻止呢?

換句話說:代替

start
2
stop

我可以得到輸出

start
stop
2

使用async 我需要異步,因為我在線發現了需要返回值時非常有用。 這也很容易閱讀! 我不想使用std::packaged_task ,promises,future等,因為async很容易。

如果不能不阻塞,我可以使用其他東西嗎?

此代碼將輸出您需要的內容:

std::cout << "start" << std::endl;

std::thread{
    []() {
        auto a = std::async([]() -> int {
            std::this_thread::sleep_for(std::chrono::seconds{ 5 });
            return 2;
        });

        std::cout << a.get() << std::endl;
    }
}.detach();

std::cout << "stop" << std::endl;

如果我是你,我根本不會使用async 如果您只需要顯示一個值而又不想阻塞,則應該執行其他操作。 例如:

std::cout << "start" << std::endl;

std::thread{
    []() {
        //do here what you need and print the result
    }
}.detach();

/* ... or ...
auto t = std::thread{ ... };
t.detach();
*/

std::cout << "stop" << std::endl;

看到detach()使新線程“獨立”,並且在join()阻塞時不會阻塞。 關鍵是async 必須阻塞,因為如果它必須執行花費大量時間的操作,那么它就必須花費時間!

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM