×

Trả về giá trị từ hàm đồng bộ với co_return trong C++

Trong lập trình C++, từ phiên bản C++20, tiêu chuẩn ngôn ngữ đã giới thiệu một khái niệm mới gọi là coroutines cho phép viết mã không đồng bộ một cách rõ ràng và dễ hiểu hơn. Một trong những yếu tố quan trọng của coroutines là co_return, một từ khóa mới giúp trả về giá trị từ hàm đồng bộ.

Tìm hiểu về Coroutines

Coroutines là hàm có thể tạm dừng và tiếp tục thực thi tại nhiều điểm định sẵn. Điều này khác với hàm thông thường, chỉ có thể bắt đầu từ đầu và kết thúc tại điểm cuối cùng. Coroutines cung cấp một phương tiện mạnh mẽ để viết các trình xử lý bất đồng bộ và các thuật toán lai ghép giữa hàm và trạng thái.

Cấu trúc của Coroutines

Để làm việc với coroutines, C++20 thêm vào ba từ khóa mới: co_await, co_yieldco_return. Trong bài viết này, chúng ta sẽ tập trung vào co_return.

Sử dụng co_return trong Coroutines

co_return là từ khóa dùng để trả về giá trị từ coroutine và có một số điểm khác biệt so với return trong hàm thông thường. Đây là ví dụ đơn giản để minh họa cách sử dụng:

#include <iostream>
#include <coroutine>

struct promise_type {
    int value;

    auto get_return_object() { return std::coroutine_handle<promise_type>::from_promise(*this); }
    auto initial_suspend() { return std::suspend_always{}; }
    auto final_suspend() noexcept { return std::suspend_always{}; }
    void return_value(int v) { value = v; }
    void unhandled_exception() { std::terminate(); }
};

struct coroutine {
    using promise_type = ::promise_type;
    std::coroutine_handle<promise_type> handle;

    coroutine(std::coroutine_handle<promise_type> h) : handle(h) {}
    ~coroutine() { handle.destroy(); }

    int get() {
        return handle.promise().value;
    }
};

coroutine my_coroutine() {
    co_return 42;
}

int main() {
    auto coro = my_coroutine();
    std::cout << "Coroutine returned: " << coro.get() << std::endl;
    return 0;
}

Giải thích mã nguồn

  1. Struct promise_type: Đây là cấu trúc chứa thông tin quản lý cho coroutine. Trong đó, return_value được gọi khi co_return được sử dụng.

  2. Coroutine Handle: Sử dụng std::coroutine_handle để quản lý và điều khiển coroutine.

  3. Coroutine Function: my_coroutine là hàm coroutine, trong đó co_return trả về giá trị 42.

  4. Sử dụng Handle: Trong main(), chúng ta lấy giá trị trả về từ coroutine bằng cách gọi coro.get().

Kết luận

Sử dụng co_return trong coroutines là một cải tiến quan trọng của C++20, giúp các lập trình viên viết mã bất đồng bộ dễ dàng và rõ ràng hơn. Bằng cách hiểu và áp dụng đúng cách sử dụng co_return, bạn có thể tận dụng sức mạnh của coroutines để làm cho mã của mình hiệu quả và linh hoạt hơn.

Hãy tiếp tục khám phá coroutines và các tính năng khác của C++20 để tận dụng tối đa hiệu quả mà phiên bản mới nhất của ngôn ngữ mang lại.

Comments