📅  最后修改于: 2023-12-03 14:59:48.483000             🧑  作者: Mango
在现代计算机系统中,多核和多线程已经成为标准配置,这也促使程序员们更加关注并发性方面的问题。而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++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++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,包括线程,原子操作和并行算法等。在编写高效和可靠的多线程程序时,这些工具非常有用。