📜  c++ 中的并发性(1)

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

C++中的并发性

在现代计算机系统中,多核和多线程已经成为标准配置,这也促使程序员们更加关注并发性方面的问题。而C++作为一种高效性和灵活性都很高的编程语言,提供了强大的支持来处理多线程和并发性问题。

C++中的线程

C++11起就提供了跨平台的线程库,可以使用C++标准库中的thread头文件进行多线程的编程。在这个库中,线程对象是std::thread类型的,我们可以通过在这个对象中指定一个函数的地址或者lambda函数来创建新的线程,例如:

#include <iostream>
#include <thread>

void hello() {
    std::cout << "Hello World!\n";
}

int main() {
    std::thread t(hello);
    t.join();
    return 0;
}

这个例子中,我们定义了一个函数hello并将其传递给std::thread对象,然后调用了这个对象的join()方法等待线程完成。

除此之外,C++11还提供了互斥量(std::mutex)和条件变量(std::condition_variable),可以用来协调多个线程的运行。

C++中的原子操作

原子操作就是一个操作在执行期间不能中断或者被其他线程干扰。C++11提供了一套原子操作API,可以保证多个线程同时访问同一变量时不会出现竞争的情况。例如:

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

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

void increment() {
    for (int i = 0; i < 10000; ++i) {
        ++counter;
    }
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);
    t1.join();
    t2.join();

    std::cout << "counter = " << counter << std::endl;
    return 0;
}

这个例子中,我们定义了一个原子变量counter,然后启动了两个线程来对该变量进行操作。由于这个变量是原子的,所以不会出现竞争和数据不一致的问题。

C++中的并行算法

C++17开始提供了标准库中定义的几个并行算法,它们可以在多线程环境下高效地并行运行。例如:

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>

int main() {
    std::vector<int> v = {5, 7, 2, 4, 8, 1, 3, 6};

    std::sort(std::execution::par, v.begin(), v.end());

    for (auto i : v) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

这个例子中,我们使用了C++17中的并行算法std::sort,它可以在多个线程中对一个向量进行排序。

总结

C++中提供了很多支持并发性编程的工具和API,包括线程,原子操作和并行算法等。在编写高效和可靠的多线程程序时,这些工具非常有用。