📜  c++中的多线程(1)

📅  最后修改于: 2023-12-03 15:14:03.510000             🧑  作者: Mango

C++中的多线程

C++中的多线程是一种同时运行多个线程的机制。线程是在一个进程内并行运作的执行流。

使用多线程可以大幅提高程序的效率,比如在一个计算密集型的任务中,多线程可以将任务分成多个子任务,每个子任务在不同的线程上执行,从而可以充分利用多核CPU的性能,缩短任务完成时间。

在C++中,标准库为我们提供了多线程编程的相关支持,包括线程创建、同步、互斥、条件变量等等。下面我们将逐一介绍这些功能。

线程创建

在C++中,我们可以通过std::thread类实现线程的创建。下面是一个简单的例子:

#include <iostream>
#include <thread>

void hello() {
    std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
}

int main() {
    std::thread t(hello);
    std::cout << "Hello from main thread " << std::this_thread::get_id() << std::endl;
    t.join();
    return 0;
}

在上面的例子中,我们定义了一个名为hello的函数,用于在线程中执行,然后使用std::thread类创建了一个新线程t,将hello函数作为参数传递给线程,最后使用t.join()等待该线程运行完成。

同步

在多线程程序中,经常需要同步不同线程之间的操作,以保证数据的正确性和可靠性。C++标准库提供了一些同步原语,包括std::mutexstd::atomicstd::condition_variable等。

互斥

std::mutex提供了一种互斥锁的机制,可以保证同一时间只有一个线程可以访问受保护的数据。下面是一个示例:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void print(char ch) {
    mtx.lock();
    for (int i = 0; i < 5; ++i) {
        std::cout << ch << std::endl;
    }
    mtx.unlock();
}

int main() {
    std::thread t1(print, 'a');
    std::thread t2(print, 'b');
    t1.join();
    t2.join();
    return 0;
}

在上面的例子中,我们定义了一个名为print的函数,用于打印字母,使用std::mutex类保护共享资源std::cout,以确保每个线程打印的字母不会混在一起。

原子变量

std::atomic提供了一种原子操作的机制,可以保证对同一变量进行的操作在多个线程之间是完全可见的。下面是一个示例:

#include <iostream>
#include <thread>
#include <atomic>

std::atomic<int> cnt(0);

void increment() {
    for (int i = 0; i < 1000000; ++i) {
        ++cnt;
    }
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);
    t1.join();
    t2.join();
    std::cout << "cnt = " << cnt << std::endl;
    return 0;
}

在上面的例子中,我们定义了一个std::atomic<int>类型的变量cnt,使用++cnt操作对其进行原子加操作。

条件变量

std::condition_variable提供了一种线程之间等待和通知的机制,可以用于实现复杂的同步机制。下面是一个示例:

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

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

void worker() {
    std::unique_lock<std::mutex> lock(mtx);
    while (!ready) {
        cv.wait(lock);
    }
    std::cout << "Worker is working" << std::endl;
}

void notifier() {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::unique_lock<std::mutex> lock(mtx);
    ready = true;
    cv.notify_all();
}

int main() {
    std::thread t1(worker);
    std::thread t2(notifier);
    t1.join();
    t2.join();
    return 0;
}

在上面的例子中,我们定义了两个线程t1t2t1等待条件变量ready为真,t2休眠2秒后将ready设置为真,并通知所有等待该条件变量的线程。

总结

C++中的多线程编程为我们提供了一种强大的工具,可以充分利用多核CPU的性能,大幅提高程序的效率。在使用多线程时,我们需要注意数据的同步和互斥,避免产生竞态条件和死锁等错误。