面试二十六、c++语言级别的多线程编程

一、 多线程编程

​​​​​

这里的c++语言级别的多线程和linux的有一定的区别,c++语言级别提供的多线程比较严格,如果主线程结束了,但是子线程没有结束,进程就会异常终止,而linux不会,会继续执行。

二、模拟卖票

2.1 使用mutex互斥量
2.2 使用lock_guard(栈上对象出作用域析构),但是不支持拷贝构造和赋值重载,在函数调用和参数传递过程中就不能使用。和智能指针的socped_ptr类似
3.unique_lock 和 unique_ptr相似

unique_lock允许右值引用的拷贝构造和赋值,

三、线程间同步通信机制

cpp 复制代码
#include <iostream>
#include <thread>
#include <shared_mutex>
#include <vector>
#include <chrono>

class ReadWriteLock {
public:
    void read() {
        std::shared_lock<std::shared_mutex> lock(mutex_);
        std::cout << "Thread " << std::this_thread::get_id() << " is reading." << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟读取操作
        std::cout << "Thread " << std::this_thread::get_id() << " has finished reading." << std::endl;
    }

    void write() {
        std::unique_lock<std::shared_mutex> lock(mutex_);
        std::cout << "Thread " << std::this_thread::get_id() << " is writing." << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟写入操作
        std::cout << "Thread " << std::this_thread::get_id() << " has finished writing." << std::endl;
    }

private:
    std::shared_mutex mutex_;
};

void reader(ReadWriteLock& rw_lock) {
    for (int i = 0; i < 5; ++i) {
        rw_lock.read();
    }
}

void writer(ReadWriteLock& rw_lock) {
    for (int i = 0; i < 5; ++i) {
        rw_lock.write();
    }
}

int main() {
    ReadWriteLock rw_lock;
    std::vector<std::thread> threads;

    // 启动多个读线程
    for (int i = 0; i < 3; ++i) {
        threads.emplace_back(reader, std::ref(rw_lock));
    }

    // 启动多个写线程
    for (int i = 0; i < 2; ++i) {
        threads.emplace_back(writer, std::ref(rw_lock));
    }

    // 等待所有线程完成
    for (auto& t : threads) {
        t.join();
    }

    return 0;
}

自旋锁(spinlock)是一种用于多线程同步的锁机制,通过忙等待(不断地检查锁的状态)来实现,而不是将线程挂起或阻塞。自旋锁的主要特点是,当一个线程试图获取锁但锁已经被其他线程持有时,它会在一个循环中反复检查锁的状态,直到锁被释放。由于自旋锁在等待时不进行上下文切换,因此它适用于锁定时间很短的场景。

四、lock_guard 和 unique_lock

五、CAS

相关推荐
IT大白鼠1 小时前
搜索系列 · 第 08 篇——面试收官:高频题与全景总结
elasticsearch·面试·nosql
JAVA面经实录9173 小时前
线上故障标准处理流程【完整版|面试背诵+生产落地】
java·面试·职场和发展
yuanxi2003 小时前
青海共和百万千瓦光伏光热项目并网发电:大客户销售如何用价值力抓住能源大单
大数据·职场和发展·能源·创业创新·学习方法
浪浪山_大橙子5 小时前
公司里的 AI,终于不只会聊天:我用 GPT‑6 把企业工作伙伴开源了
前端·后端·面试
无限码力5 小时前
华为OD面试手撕真题 【合并相邻且相等的元素】多语言题解
华为od·面试·华为od面试真题·华为od面试手撕真题·华为od面试算法真题
乌暮6 小时前
JVM 原理与实践:从运行时数据区到线上故障排查
java·开发语言·jvm·后端·学习·面试
ychqsq7 小时前
206.归程
经验分享·职场和发展
时间的拾荒人7 小时前
Qt 界面布局与容器控件详解:从分组框到布局管理器
开发语言·qt·面试
ShineWinsu8 小时前
对于Redis:ZSet类型的解析
数据库·c++·redis·缓存·面试·有序集合·zset
keke.shengfengpolang9 小时前
2026年财务经营分析校招技术能力拆解:SQL取数、Power BI看板、AI辅助分析,面试到底考什么
面试