Sobes.tech
Middle+

Чӣ гуна бояд санҷед, ки оё дар яке аз сӯрохиҳо истисно рух додааст?

sobes.tech AI

Ҷавоб аз AI

Барои санҷидани истисно дар сӯрох, метавон чанд роҳро истифода бурд, вобаста ба он ки чӣ гуна сӯрох сохта шудааст ва чӣ гуна натиҷаҳои он коркард мешаванд.

  1. Истифодаи std::future ва std::async: Агар сӯрох бо ёрии std::async оғоз ёфта бошад, натиҷа объект std::future хоҳад буд. Занг кардани методҳои get() ё wait() ба ин объект, истисно, ки дар сӯрох партофта шудааст, дубора партофта мешавад дар сӯрохи даъваткунанда.

    #include <future>
    #include <iostream>
    #include <stdexcept>
    
    void thread_function() {
        throw std::runtime_error("Хатогӣ дар сӯрох!");
    }
    
    int main() {
        std::future<void> future = std::async(std::launch::async, thread_function);
    
        try {
            future.get(); // интизор мешавад ва агар хатогӣ бошад, партофта мешавад
        } catch (const std::exception& e) {
            std::cerr << "Истисно аз сӯрох: " << e.what() << std::endl;
        }
    
        return 0;
    }
    
  2. Истифодаи std::promise ва std::future: Метавон ба таври равшан std::promise-ро ба сӯрох гузаронд ё онро дар берун аз он нигоҳ дошт, то ки сӯрох метавонад истисноро нигоҳ дорад.

    #include <future>
    #include <iostream>
    #include <thread>
    #include <stdexcept>
    
    void thread_function_with_promise(std::promise<void>&& promise) {
        try {
            throw std::runtime_error("Хатогии дигар дар сӯрох!");
            promise.set_value(); // гузоштани арзиш (агар хатогӣ набошад)
        } catch (...) {
            promise.set_exception(std::current_exception()); // нигоҳ доштани истисно
        }
    }
    
    int main() {
        std::promise<void> promise;
        std::future<void> future = promise.get_future();
    
        std::thread t(thread_function_with_promise, std::move(promise));
    
        try {
            future.get(); // интизор мешавад ва истиснои нигоҳдоштаро партофта мешавад
        } catch (const std::exception& e) {
            std::cerr << "Истисно аз сӯрох (бо ёрии promise): " << e.what() << std::endl;
        }
    
        t.join(); // интизор мешавад, ки сӯрох ба охир расад
    
        return 0;
    }
    
  3. Идораи дастӣ кардани истисно: Сӯрох метавонад истисноро дар дохили худ фатҳ кунад ва онро нигоҳ дорад (масалан, дар std::exception_ptr) ё огоҳ кунад сӯрохи дигарро дар бораи пайдоиши он (масалан, тавассути тағйирёбандаи атомӣ ё мьютекс бо тағйирёбандаи шароит).

    #include <iostream>
    #include <thread>
    #include <atomic>
    #include <exception>
    #include <mutex>
    #include <condition_variable>
    
    std::exception_ptr global_exception_ptr = nullptr;
    std::mutex exception_mutex;
    std::condition_variable exception_cv;
    bool exception_occurred = false;
    
    void thread_function_manual() {
        try {
            throw std::logic_error("Хатои мантиқӣ дар сӯрох!");
        } catch (...) {
            std::lock_guard<std::mutex> lock(exception_mutex);
            global_exception_ptr = std::current_exception(); // нигоҳ доштани истисно
            exception_occurred = true;
            exception_cv.notify_one(); // огоҳ кардани сӯрохи интизор
        }
    }
    
    int main() {
        std::thread t(thread_function_manual);
    
        // сӯрохи асосӣ метавонад интизор шавад, ки огоҳӣ дар бораи истисно
        std::unique_lock<std::mutex> lock(exception_mutex);
        exception_cv.wait(lock, []{ return exception_occurred; });
    
        if (global_exception_ptr) {
            try {
                std::rethrow_exception(global_exception_ptr); // баргардондани истиснои нигоҳдоштаро
            } catch (const std::exception& e) {
                std::cerr << "Истисно аз сӯрох (идораи дастӣ): " << e.what() << std::endl;
            }
        }
    
        t.join(); // интизор шудан барои анҷоми сӯрох
    
        return 0;
    }
    

Интихоби усул аз контекст вобаста аст: std::async бо std::future барои гирифтани натиҷа ё истисно аз вазифаи ҷудогона қулайтар аст, дар ҳоле ки std::promise/std::future ё идораи дастӣ дар сенарияҳои мураккаби ҳамоҳангсозӣ кӯмак мекунанд.