atomic 、unique_lock 和lock_guard的区别以及各自的使用场景

atomic、unique_lock和lock_guard都是多线程编程中的同步机制,用于保护共享资源,避免同一时间多个线程访问。它们各自有不同的使用场景和优缺点。

1. atomic:atomic是一个线程安全的原子变量类型,可用于保护共享资源的读写操作。对于简单的变量类型比如int或bool,可以使用atomic来让多个线程对其进行原子操作。atomic提供了load()和store()等原子操作函数来读写变量的值,还提供了各种原子操作符如+=、-=、++、--等来修改变量的值。

2. unique_lock:unique_lock是一个灵活的锁类型,可以用于实现各种不同的同步模式。它可以和条件变量一起使用,可以在等待期间释放锁,还可以通过提供不同的Lockable类型的模板参数来实现不同的锁类型。unique_lock提供了lock()和unlock()等函数来手动控制锁的获取和释放,可以使用std::adopt_lock和std::defer_lock等策略来控制锁的初始化。

3. lock_guard:lock_guard是一个简单的锁封装类型,用于保护共享资源的访问,保证在其生命周期内获取锁并在其析构时释放锁。lock_guard通常用于简单的同步代码块中,如读写锁,临界区等,以保证共享资源的安全访问。lock_guard的构造函数中会获取锁,析构函数中会自动释放锁,使得多线程访问共享资源变得简单和安全。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
void URcontrolcenter::start() { // 创建六个线程 for (int i = 0; i < 6; ++i) { threads.push_back(std::thread(&URcontrolcenter::processTasks, this));//六个线程同时运行 } // 将任务分配到队列中 for (int i = 0; i < relationship_list.size(); ++i) { taskQueue.push(i); } // 等待所有任务完成 std::unique_lockstd::mutex lock(mutex); conditionVariable.wait(lock, //阻塞当前线程 this{ return tasksCompleted == relationship_list.size(); });//表示所有任务已经完成,线程可以继续执行。 }void URcontrolcenter::processTasks() { //下面先报完成,然后下一轮上面给弹出 RewriteRelationShip relationship; int taskNumber; while (true) { // 获取下一个任务 { //std::lock_guardstd::mutex lock(mutex);//使用线程锁确保线程安全 std::unique_lockstd::mutex lock(mutex); if (taskQueue.empty()) { //检查当前任务是否已经全部完成,如果已经完成,则退出循环,否则获取下一个任务,并处理该任务。 return; } taskNumber = taskQueue.front(); taskQueue.pop(); } // 处理任务 relationship.parseData(relationship_list[taskNumber],worningcrosstype); // 在任务完成后,增加了已完成任务的数量,并检查是否所有任务都已经完成。如果所有任务都已经完成,则调用conditionVariable.notify_one()函数,通知等待线程可以继续执行。 { std::lock_guardstd::mutex lock(mutex);//使用了std::lock_guard对象锁定了互斥锁mutex,以确保线程安全。 ++tasksCompleted; if (tasksCompleted == relationship_list.size()) { // 所有任务已完成,通知等待线程 conditionVariable.notify_one(); } } } } 这段代码在运行中死机,且有多个线程执行统一任务,分析原因,给出修改方案
最新发布
05-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值