c++线程的一些理解

目前多线程方面我主要会用两种方式:Qt的QThread和std::thread,都是跨平台,封装了系统的线程库。 暂时还没用到WindowsApi的thread和Linux的pthread。

线程同步方面主要使用互斥锁mutex和条件变量condition_variable,没有用到一定需要用信号量的场景且互斥锁效率不一定比读写锁差,所以所有项目我都只用互斥锁和条件变量基本都能实现需求。

互斥锁:保证临界区代码同时只能被一个线程访问。最常用的同步方式。

有一些注意的地方Winodows下,锁在同一个线程中还没解锁的情况下再次锁 会直接导致崩溃,据说linux下只是阻塞,有待测试。我们要避免在同一个线程中未解锁的情况下锁两次。其次,mutex最好用raii的方式封装,自动解锁。

条件变量:线程同步中 我们往往需要用条件变量阻塞线程,等到满足条件之后,再唤醒线程。同时提供了等待条件变量满足的 wait 系列方法(wait、wait_for、wait_until 方法),发送条件信号使用 notify 方法(notify_one 和 notify_all 方法),使用 std::condition_variable 对象时需要绑定一个 std::unique_lock 或 std::lock_guard 对象。在linux平台下会存在虚假唤醒的情况,我们可以用while而不用if判断条件规避虚假唤醒。

猜你喜欢

转载自blog.csdn.net/qq_36533978/article/details/107684960