stl-thread-001

介紹c++11引入的標準線程類thread,屬於入門系列。
這是第一篇,轉自c++標準庫:開2個子線程運行,並取得結果;

#include<future>
#include<thread>
#include<iostream>
#include<random>
#include<chrono>
#include<exception>
using std::cout;
using std::endl;

void doSomeThing(char c)
{
    std::default_random_engine engine(c);
    std::uniform_int_distribution<int> distribute(200, 1000);
    for (int i = 0; i < 10;i++)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(distribute(engine)));
        cout.put(c).flush();
    }
}

int main()
{
    cout << "2 task starting..." << endl;
    std::future<void> f1 = std::async([]{doSomeThing('-'); });
    std::future<void> f2 = std::async([]{doSomeThing('+'); });

    if (f1.wait_for(std::chrono::seconds(0)) != std::future_status::deferred || 
        f2.wait_for(std::chrono::seconds(0)) != std::future_status::deferred)
    {
        while (f1.wait_for(std::chrono::seconds(0)) != std::future_status::ready &&
               f2.wait_for(std::chrono::seconds(0)) != std::future_status::ready)
        {
            std::this_thread::yield();
        }
    }
    cout << endl;
    try
    {
        f1.get();//取得結果,每一個future的get()只能執行一次;
        f2.get();//取得結果,每一個future的get()只能執行一次;
    }
    catch (const std::exception& e)
    {
        cout << "exception:" << e.what();
    }
    cout << "\ndone!" << endl;

    getchar();
    getchar();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章