📅  最后修改于: 2023-12-03 15:14:03.510000             🧑  作者: Mango
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::mutex
、std::atomic
、std::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;
}
在上面的例子中,我们定义了两个线程t1
和t2
,t1
等待条件变量ready
为真,t2
休眠2秒后将ready
设置为真,并通知所有等待该条件变量的线程。
C++中的多线程编程为我们提供了一种强大的工具,可以充分利用多核CPU的性能,大幅提高程序的效率。在使用多线程时,我们需要注意数据的同步和互斥,避免产生竞态条件和死锁等错误。