一、C++11线程库简介
C++11线程库是C++11标准中新增的库,它提供了创建和控制执行线程的功能,这使得在C++中编写多线程程序更加方便和容易。C++11线程库包含了一些重要的类:
- std::thread:用于创建线程。
- std::mutex:用于保护共享数据的互斥锁。
- std::condition_variable:用于线程间的通信,实现等待和通知机制。
使用这些类可以实现多个线程的同步和协作。
二、使用std::thread创建线程
使用std::thread创建线程的步骤如下:
- 定义一个函数,这个函数将作为子线程的入口点。
- 创建std::thread对象,指定子线程的入口点函数。
- 在主线程中调用std::thread的join()函数等待子线程执行完毕。
#include #include // 子线程入口点函数 void thread_func() { std::cout << "子线程开始执行" << std::endl; // TODO: 子线程具体执行的任务 std::cout << "子线程执行完毕" << std::endl; } int main() { std::cout << "主线程开始执行" << std::endl; std::thread t(thread_func); // 创建子线程,指定入口点函数 t.join(); // 等待子线程执行完毕 std::cout << "主线程执行完毕" << std::endl; return 0; }
三、使用std::mutex实现互斥锁
当多个线程访问共享数据时,需要确保每个线程在访问共享数据时不会相互干扰,防止数据不一致的情况发生。这时就需要使用互斥锁来防止多个线程同时访问共享数据。
使用std::mutex实现互斥锁的步骤如下:
- 定义std::mutex对象。
- 使用std::lock_guard保护共享数据。
- 确保每个线程都使用std::lock_guard来保护共享数据。
#include #include #include std::mutex g_mutex; // 子线程入口点函数 void thread_func() { std::cout << "子线程开始执行" << std::endl; // 使用std::lock_guard保护共享数据 std::lock_guard guard(g_mutex); // TODO: 子线程访问共享数据 std::cout << "子线程执行完毕" << std::endl; } int main() { std::cout << "主线程开始执行" << std::endl; // 使用std::lock_guard保护共享数据 std::lock_guard guard(g_mutex); std::thread t(thread_func); // 创建子线程,指定入口点函数 t.join(); // 等待子线程执行完毕 std::cout << "主线程执行完毕" << std::endl; return 0; }
四、使用std::condition_variable实现线程间通信
在多线程程序中,有时需要线程间进行通信,以实现协作。std::condition_variable可以用于实现线程间的等待和通知机制。
使用std::condition_variable的步骤如下:
- 定义一个std::condition_variable对象。
- 在等待条件成立时,调用std::condition_variable的wait()函数进入等待状态。
- 在条件成立时,调用std::condition_variable的notify_one()或notify_all()函数通知等待的线程。
#include #include #include #include std::mutex g_mutex; std::condition_variable g_cv; bool g_flag = false; // 子线程入口点函数 void thread_func() { std::cout << "子线程开始执行" << std::endl; std::unique_lock lock(g_mutex); // 等待条件成立 while (!g_flag) { std::cout << "等待条件成立" << std::endl; g_cv.wait(lock); // 进入等待状态 } // TODO: 子线程具体执行的任务 std::cout << "子线程执行完毕" << std::endl; } int main() { std::cout << "主线程开始执行" << std::endl; std::thread t(thread_func); // 创建子线程,指定入口点函数 std::this_thread::sleep_for(std::chrono::seconds(3)); // 暂停3秒钟 // 在条件成立时,通知等待的线程 { std::lock_guard guard(g_mutex); g_flag = true; std::cout << "条件成立,通知等待的线程" << std::endl; } g_cv.notify_one(); t.join(); // 等待子线程执行完毕 std::cout << "主线程执行完毕" << std::endl; return 0; }
五、总结
本文介绍了使用C++11线程库编写高效多线程程序的一些方法,包括使用std::thread创建线程,使用std::mutex实现互斥锁,使用std::condition_variable实现线程间通信等。
在进行多线程编程时,需要注意线程间的同步和协作,保证程序的正确性和高效性。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/306498.html