ফিউচার বনাম প্রতিশ্রুতি


134

আমি নিজেকে ভবিষ্যতের এবং প্রতিশ্রুতির মধ্যে পার্থক্যের সাথে বিভ্রান্ত করছি।

স্পষ্টতই, তাদের বিভিন্ন পদ্ধতি এবং স্টাফ রয়েছে, তবে আসল ব্যবহারের ক্ষেত্রে কী?

তাই কি?:

  • আমি যখন কিছু অ্যাসিঙ্ক টাস্ক পরিচালনা করি তখন আমি ভবিষ্যতে "ভবিষ্যতে" মান পেতে ব্যবহার করি
  • আমি যখন অ্যাসিঙ্ক টাস্ক তখন আমি আমার প্রতিশ্রুতি থেকে ভবিষ্যত পেতে ব্যবহারকারীকে রিটার্ন টাইপ হিসাবে প্রতিশ্রুতি ব্যবহার করি

1
এই উত্তরে আমি এ সম্পর্কে কিছুটা লিখেছিলাম ।
কেরেক এসবি

উত্তর:


162

ভবিষ্যত এবং প্রতিশ্রুতি তাত্পর্যপূর্ণ অপারেশনের দুটি পৃথক দিক sides

std::promise অ্যাসিক্রোনাস অপারেশনের "প্রযোজক / লেখক" দ্বারা ব্যবহৃত হয়।

std::future অ্যাসিক্রোনাস অপারেশনের "ভোক্তা / পাঠক" দ্বারা ব্যবহৃত হয়।

এটি এই দুটি পৃথক "ইন্টারফেস" এ বিভক্ত হওয়ার কারণ হ'ল "গ্রাহক / পাঠক" থেকে "লিখন / সেট" কার্যকারিতা আড়াল করা

auto promise = std::promise<std::string>();

auto producer = std::thread([&]
{
    promise.set_value("Hello World");
});

auto future = promise.get_future();

auto consumer = std::thread([&]
{
    std::cout << future.get();
});

producer.join();
consumer.join();

Std :: async স্ট্যান্ডার্ড :: প্রতিশ্রুতি প্রয়োগের একটি (অপূর্ণ) উপায় হ'ল:

template<typename F>
auto async(F&& func) -> std::future<decltype(func())>
{
    typedef decltype(func()) result_type;

    auto promise = std::promise<result_type>();
    auto future  = promise.get_future();

    std::thread(std::bind([=](std::promise<result_type>& promise)
    {
        try
        {
            promise.set_value(func()); // Note: Will not work with std::promise<void>. Needs some meta-template programming which is out of scope for this question.
        }
        catch(...)
        {
            promise.set_exception(std::current_exception());
        }
    }, std::move(promise))).detach();

    return std::move(future);
}

ব্যবহার std::packaged_taskযা সাহায্যকারী (এটা অর্থাৎ মূলত আমরা উপরোক্ত করছিলে করে) প্রায় std::promiseআপনাকে নিম্নলিখিত যা সম্পূর্ণ এবং সম্ভবত দ্রুততর করতে পারে:

template<typename F>
auto async(F&& func) -> std::future<decltype(func())>
{
    auto task   = std::packaged_task<decltype(func())()>(std::forward<F>(func));
    auto future = task.get_future();

    std::thread(std::move(task)).detach();

    return std::move(future);
}

নোট করুন যে থ্রেড শেষ না হওয়া অবধি ধ্বংস হওয়া আসলে যখন থামবে তখন std::asyncফিরে আসার জায়গা থেকে কিছুটা আলাদা std::future


3
@ তারাগুলি পরামর্শ দেয় যে ফিরে আসা ব্যার্থহীন std::move(something)এবং এটি (এন) আরভিওকেও ব্যথা দেয়। তার সম্পাদনাটি ফিরিয়ে দেওয়া হচ্ছে।
polkovnikov.ph

ভিজ্যুয়াল স্টুডিও 2015 এ দয়া করে std :: cout << future.get ()। C_str () ব্যবহার করুন;
দামিয়ান

6
যারা এখনও বিভ্রান্ত তাদের জন্য এই উত্তরটি দেখুন
কাওয়িং-চিউ

2
এটি হ'ল এক সময়ের প্রযোজক - গ্রাহক, আইএমএইচও যা প্রকৃতপক্ষে উত্পাদক নয় - গ্রাহক প্যাটার্ন।
মার্টিন মিজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.