C++系列十:日常学习-多线程
TOC介绍:
C++ 是一种支持多线程编程的编程语言,它提供了丰富的多线程支持来充分利用现代多核处理器的性能。
C++ 多线程编程通常使用标准库中的头文件以及其他相关的标准库组件来实现。
理论:
[*]常用的类:
stdthread 类,用于创建和管理线程等等
stdthis_thread 命名空间中的函数来处理线程的等待和分离等等
互斥锁(stdmutex)、条件变量(stdcondition_variable)和原子操作(std::atomic)
[*]线程池:
线程池是一种管理和复用线程的技术,以避免频繁创建和销毁线程。C++ 标准库中没有直接提供线程池的实现,但你可以使用第三方库或自己编写一个简单的线程池。
[*]请注意,多线程编程可能会引入一些复杂性和潜在的问题,如竞态条件和死锁。因此,确保充分理解多线程编程的概念和最佳实践,并使用适当的同步机制来确保线程安全是非常重要的。
案例:
std::thread:join() //阻塞当前线程,直到目标线程执行完毕。detach() //将线程分离,使其成为后台线程,不再受到 join() 的控制。//创建互斥锁,并在访问共享资源之前进行锁定。std::mutex mtx;mtx.lock(); // 锁定互斥锁// 访问共享资源mtx.unlock(); // 解锁互斥锁//自动管理锁的生命周期,以确保在离开作用域时自动释放锁。std::mutex mtx;{ std::lock_guard lock(mtx); // 自动锁定和解锁 // 访问共享资源} // 离开作用域时自动解锁//条件变量用于在线程之间进行通信和同步。它们允许一个线程等待另一个线程发出的通知,以执行某些操作。std::condition_variable cv;// 线程1等待通知std::unique_lock lock(mtx);cv.wait(lock); // 阻塞线程1,直到收到通知// 线程2发送通知cv.notify_one(); // 通知线程1//原子操作:std::atomic counter(0);counter.fetch_add(1, std::memory_order_relaxed); // 原子递增操作//案例1:#include #include void myFunction() { // 线程1执行的代码}void myFunction1(int value) { // 线程2执行的代码}int main() { std::thread t1(myFunction); // 创建新线程并启动 std::thread t2(myFunction1,100); // 创建新线程并启动 t1.join(); // 等待线程完成 t2.join(); // 等待线程完成 return 0;}//案例2:#include #include #include std::mutex mtx;void myFunction(int& counter) { for (int i = 0; i < 1000; ++i) { std::lock_guard lock(mtx); // 使用互斥锁保护共享资源 counter++; }}int main() { int counter = 0; std::thread t1(myFunction, std::ref(counter)); std::thread t2(myFunction, std::ref(counter)); t1.join(); t2.join(); std::cout
页:
[1]