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::mutex
,std::condition_variable
和std::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::mutex
和std::condition_variable
来实现线程同步。set_flag
函数设置flag
为真并通知等待中的线程,wait_for_flag
函数等待flag
被设置为真。
线程间通信
线程间通信是指线程之间传递数据的过程。C++提供了多种线程间通信机制,如std::thread::join()
,std::thread::detach()
,std::future
和std::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
好好学习,天天向上