C++线程同步的方式

  1. 互斥锁
    互斥锁是用来防止多个线程同时访问共享资源对象的机制,在同一时间只有一个线程可以拥有一个特定的锁对象,其他线程如果尝试获取锁会阻塞直到锁资源被释放或直接返回失败。
    针对这道题我们可以用两个互斥锁来阻塞 second 和 third 函数,分别在 first 和 second 执行结束后解锁。

  2. 条件变量
    条件变量一般和互斥锁搭配使用,互斥锁用于上锁,条件变量用于在多线程环境中等待特定事件发生。
    针对这道题我们可以分别在 first 和 second 执行完之后修改特定变量的值(例如修改成员变量 k 为特定值),然后通知条件变量,唤醒下一个函数继续执行。
    c++
    std::condition_variable 是一种用来同时阻塞多个线程的同步原语(synchronization primitive),std::condition_variable 必须和 std::unique_lock 搭配使用

  3. 信号量
    信号量是用来实现对共享资源的同步访问的机制,其使用方法和条件变量类似,都是通过主动等待和主动唤醒来实现的。
    c++
    c++ 标准库中并没有信号量的实现和封装,我们可以用 c 语言提供的 <sempahore.h> 库来解题

  4. 异步操作
    异步操作是一种,在不需要等待被调用方返回结果之前,就让操作继续进行下去的方法。针对这道题可以使用基于 future/promise 的异步编程模型。
    future 和 promise 起源于函数式编程,其目的是将值(future)和计算方式(promise)分离,使得 promise 可以异步地修改 future,从而提高代码的可读性,并减少通信延迟。
    c++
    std::future 是用来获取异步操作结果的模板类;std::packaged_task, std::promise, std::async 都可以进行异步操作,并拥有一个 std::future 对象,用来存储它们所进行的异步操作返回或设置的值(或异常),这个值会在将来的某一个时间点,通过某种机制被修改后,保存在其对应的 std::future 对象中:
    对于 std::promise,可以通过调用 std::promise::set_value 来设置值并通知 std::future 对象

  5. 原子操作
    我们平时进行的数据修改都是非原子操作,如果多个线程同时以非原子操作的方式修改同一个对象可能会发生数据争用,从而导致未定义行为;而原子操作能够保证多个线程顺序访问,不会导致数据争用,其执行时没有任何其它线程能够修改相同的原子对象。
    针对这道题,我们可以让 second 和 third 函数等待原子变量被修改为某个值后再执行,然后分别在 first 和 second 函数中来修改这个原子变量。
    c++
    c++ 11 提供了 std::atomic 模板类来构造原子对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值