Trang tài liệu
Khóa học C++ nền tảng
Chương 11. Thư viện mẫu chuẩn (STL)
Đa luồng trong C++

Đa luồng trong C++

Đa luồng là việc thực thi đồng thời nhiều luồng trong một quy trình hoặc chương trình. Nó cải thiện hiệu suất và hiệu quả của một ứng dụng bằng cách cho phép nhiều tác vụ được thực thi song song.

Trong C++, hỗ trợ đa luồng có sẵn thông qua thư viện thread được giới thiệu trong tiêu chuẩn C++11.

Tạo luồng cơ bản

Để tạo một luồng mới, hãy bao hàm tệp tiêu đề và tạo một phiên bản của std::thread nhận một hàm làm đối số. Hàm sẽ được thực hiện trong một luồng mới.

#include <iostream>
#include <thread>
 
void my_function() {
    std::cout << "This function is executing in a separate thread" << std::endl;
}
 
int main() {
    std::thread t(my_function);
    t.join(); // chờ luồng hoàn thành
    return 0;
}

Luồng với đối số

Bạn có thể truyền đối số cho hàm luồng bằng cách cung cấp chúng dưới dạng đối số bổ sung cho hàm tạo std::thread.

#include <iostream>
#include <thread>
 
void print_sum(int a, int b) {
    std::cout << "The sum is: " << a + b << std::endl;
}
 
int main() {
    std::thread t(print_sum, 3, 5);
    t.join();
    return 0;
}

Mutex và Khóa

Khi nhiều luồng truy cập tài nguyên được chia sẻ, có khả năng xảy ra cuộc chạy đua dữ liệu. Để tránh điều này, hãy sử dụng mutex và khóa để đồng bộ hóa quyền truy cập tài nguyên được chia sẻ.

#include <iostream>
#include <mutex>
#include <thread>
 
std::mutex mtx;
 
void print_block(int n, char c) {
    {
        std::unique_lock<std::mutex> locker(mtx);
        for (int i = 0; i < n; ++i) {
            std::cout << c;
        }
        std::cout << std::endl;
    }
}
 
int main() {
    std::thread t1(print_block, 50, '*');
    std::thread t2(print_block, 50, '$');
 
    t1.join();
    t2.join();
 
    return 0;
}

Phần giới thiệu ngắn này sẽ giúp bạn bắt đầu với các kỹ thuật đa luồng cơ bản trong C++. Còn rất nhiều điều cần tìm hiểu, chẳng hạn như nhóm luồng, biến điều kiện và hoạt động nguyên tử để điều chỉnh hiệu suất và đồng bộ hóa nâng cao.