簡體   English   中英

已經在c ++ 11或boost線程監視器中?

[英]Is already in c++11 or boost thread monitor?

已經在c ++ 11或boost線程監視器中了嗎? 我需要監視線程執行,並且當一個線程由於某種原因失敗時,我需要重新啟動。 我在c ++ 11中使用。

這取決於構成線程故障的原因。 如果您打算退出,可以將其打包:

假設我們有一個“長期運行”任務,中途失敗的可能性為25%:

int my_processing_task() // this can randomly fail
{
    static const size_t iterations = 1ul << 6;
    static const size_t mtbf       = iterations << 2; // 25% chance of failure
    static auto odds = bind(uniform_int_distribution<size_t>(0, mtbf), mt19937(time(NULL)));

    for(size_t iteration = 0; iteration < iterations; ++iteration)
    {
        // long task
        this_thread::sleep_for(chrono::milliseconds(10));

        // that could fail
        if (odds() == 37) 
            throw my_failure();
    }

    // we succeeded!
    return 42;
}

如果我們要繼續運行任務,無論任務是否正常完成或出現錯誤,我們都可以編寫一個監視包裝器:

template <typename F> void monitor_task_loop(F f)
{
    while (!shutdown)
    try {
        f();
        ++completions;
    } catch (exception const& e)
    {
        std::cout << "handling: '" << e.what() << "'\n";
        ++failures;
    }
    std::cout << "shutdown requested\n";
}

在這種情況下,我隨機認為,對定期完成的次數和失敗的次數進行計數會很好。 shutdown標志使線程可以關閉:

auto timeout = async(launch::async, []{ this_thread::sleep_for(chrono::seconds(3)); shutdown = true; });
monitor_task_loop(my_processing_task);

將運行任務監視循環約3秒鍾。 運行三個監視我們任務的后台線程的演示是Live On Coliru

使用Boost Live On Coliru添加了c ++ 03版本

此版本僅使用標准c ++ 11功能。

#include <thread>
#include <future>
#include <iostream>
#include <random>

using namespace std;

struct my_failure : virtual std::exception {
    char const* what() const noexcept { return "the thread failed randomly"; }
};

int my_processing_task() // this can randomly fail
{
    static const size_t iterations = 1ul << 4;
    static const size_t mtbf       = iterations << 2; // 25% chance of failure
    static auto odds = bind(uniform_int_distribution<size_t>(0, mtbf), mt19937(time(NULL)));

    for(size_t iteration = 0; iteration < iterations; ++iteration)
    {
        // long task
        this_thread::sleep_for(chrono::milliseconds(10));

        // that could fail
        if (odds() == 37) 
            throw my_failure();
    }

    // we succeeded!
    return 42;
}

std::atomic_bool shutdown(false);
std::atomic_size_t failures(0), completions(0);

template <typename F> void monitor_task_loop(F f)
{
    while (!shutdown)
    try {
        f();
        ++completions;
    } catch (exception const& e)
    {
        std::cout << "handling: '" << e.what() << "'\n";
        ++failures;
    }
    std::cout << "shutdown requested\n";
}

int main()
{
    auto monitor = [] { monitor_task_loop(my_processing_task); };
    thread t1(monitor), t2(monitor), t3(monitor);

    this_thread::sleep_for(chrono::seconds(3));
    shutdown = true;

    t1.join();
    t2.join();
    t3.join();

    std::cout << "completions: " << completions << ", failures: " << failures << "\n";
}

暫無
暫無

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

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