C++多线程编程

C++多线程编程

C++多线程编程

简介

多线程编程是一种并发编程模型,它允许程序在同一时间执行多个任务。C++提供了丰富的线程库,使得我们能够轻松地在程序中实现多线程。本文将介绍C++多线程编程的基本概念,线程创建,同步以及线程间通信。

线程创建

在C++中,线程可以通过std::thread类来创建。std::thread类提供了std::thread::thread()std::thread::thread(function<void()>)两种构造函数。前者用于创建一个空线程,后者用于创建一个执行指定函数的线程。

下面是一个简单的线程创建示例:

#include <iostream>
#include <thread>

void print_hello() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    std::thread t1(print_hello);
    t1.detach(); // 分离线程,使其立即执行

    std::cout << "Hello from main thread!" << std::endl;
    return 0;
}

在这个例子中,我们创建了一个执行print_hello函数的线程,并使用detach()方法让线程立即执行。

线程同步

多线程程序中,线程之间可能需要等待某个条件满足才能继续执行。C++提供了多种线程同步原语,如std::mutexstd::condition_variablestd::unique_lock等。

下面是一个简单的线程同步示例:

#include <iostream>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool flag = false;

void set_flag() {
    std::unique_lock<std::mutex> lock(mtx);
    flag = true;
    cv.notify_one();
}

void wait_for_flag() {
    std::unique_lock<std::mutex> lock(mtx);
    while (!flag) {
        cv.wait(lock);
    }
    std::cout << "Flag is set!" << std::endl;
}

int main() {
    std::thread t1(set_flag);
    std::thread t2(wait_for_flag);

    t1.join();
    return 0;
}

在这个例子中,我们使用std::mutexstd::condition_variable来实现线程同步。set_flag函数设置flag为真并通知等待中的线程,wait_for_flag函数等待flag被设置为真。

线程间通信

线程间通信是指线程之间传递数据的过程。C++提供了多种线程间通信机制,如std::thread::join()std::thread::detach()std::futurestd::promise等。

下面是一个简单的线程间通信示例:

#include <iostream>
#include <thread>
#include <future>
#include <vector>

std::vector<int> data;

void producer() {
    for (int i = 0; i < 10; ++i) {
        data.push_back(i);
    }
}

void consumer(std::promise<void> p) {
    for (int i = 0; i < 10; ++i) {
        std::cout << "Consumed: " << data[i] << std::endl;
    }
    p.set_value();
}

int main() {
    std::promise<void> p;
    std::thread t1(producer);
    std::thread t2(consumer, std::move(p));

    t1.join();
    t2.join();
    return 0;
}

在这个例子中,我们使用std::promise实现线程间通信。producer函数生产数据,consumer函数消费数据。生产者和消费者线程通过std::promise进行通信,确保数据被正确消费。

总结

C

好好学习,天天向上

京ICP备2023026874号-1

京公网安备11010702002577号