在 C++ 中,`<thread>` 头文件提供了多线程相关的类和函数,可用于创建和管理线程。下面是一个简单的示例,展示了如何创建和启动一个线程:
#include <iostream>
#include <thread>
// 线程函数
void threadFunction() {
std::cout << "这是子线程在运行" << std::endl;
}
int main() {
// 创建一个新线程并执行 threadFunction
std::thread t(threadFunction);
// 主线程输出信息
std::cout << "这是主线程在运行" << std::endl;
// 等待子线程完成
t.join();
std::cout << "子线程已完成,主线程继续执行并结束" << std::endl;
return 0;
}
在上述代码中,`std::thread` 用于创建一个新线程,它接受一个可调用对象(如函数、lambda 表达式等)作为参数。`join` 方法用于等待子线程执行完毕,确保主线程在子线程结束后才继续执行。
C++ 多线程配合原子操作的使用
当多个线程同时访问和修改共享资源时,可能会出现数据竞争问题,导致程序出现不可预期的结果。原子操作可以确保对共享资源的访问是线程安全的。C++ 提供了 `<atomic>` 头文件来支持原子操作。下面是一个使用原子操作的示例:
#include <iostream>
#include <thread>
#include <atomic>
#include <vector>
// 原子计数器
std::atomic<int> counter(0);
// 线程函数,对计数器进行递增操作
void incrementCounter() {
for (int i = 0; i < 10000; ++i) {
++counter;
}
}
int main() {
// 创建多个线程
std::vector<std::thread> threads;
for (int i = 0; i < 4; ++i) {
threads.emplace_back(incrementCounter);
}
// 等待所有线程完成
for (auto& t : threads) {
t.join();
}
// 输出最终计数器的值
std::cout << "最终计数器的值: " << counter << std::endl;
return 0;
}
在上述代码中,`std::atomic<int>` 定义了一个原子整数类型的计数器 `counter`。多个线程可以同时对 `counter` 进行递增操作,由于使用了原子操作,不会出现数据竞争问题。最后,主线程等待所有子线程完成后,输出最终的计数器值。