首页 > 编程语言 >c++常见的几种锁

c++常见的几种锁

时间:2023-03-09 14:24:47浏览次数:26  
标签:std lock 常见 c++ 几种 互斥 mutex test include

std::mutex(C++11),普通互斥锁,可以阻塞式等锁(lock())也可以非阻塞式上锁(try_lock()
std::timed_mutex(C++11),互斥锁的加时版本,如果在一段时间内(try_lock_for())或是在某个时间之前(try_lock_until())获取锁成功则成功上锁

//等待到解锁时间后解锁

#include <thread>
#include <iostream>
#include <chrono>
#include <mutex>
 
std::timed_mutex test_mutex;
 
void f()
{
    auto now=std::chrono::steady_clock::now();
    test_mutex.try_lock_until(now + std::chrono::seconds(10));
    std::cout << "hello world\n";
}
 
int main()
{
    std::lock_guard<std::timed_mutex> l(test_mutex);
    std::thread t(f);
    t.join();
}

//锁被释放线程中获取到释放的锁

#include <thread>
#include <iostream>
#include <chrono>
#include <mutex>
 
std::timed_mutex test_mutex;
 
void f()
{
    auto now=std::chrono::steady_clock::now();
    test_mutex.try_lock_until(now + std::chrono::seconds(10));
    std::cout << "hello world\n";
}
void unlock()
{
    std::lock_guard<std::timed_mutex> l(test_mutex);
    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}
int main()
{
    
    std::thread t(f);
    std::thread ll(unlock);
    ll.join();
    t.join();
    return 0;
}


std::recursive_mutex(C++11),递归互斥锁,在互斥锁的基础上允许持有锁的线程多次通过lock()或者try_lock()获取锁,而std::mutex的拥有者不能继续请求上锁

//多次持续上锁

#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>
 
int g_num = 0;  // 为 g_num_mutex 所保护
std::recursive_mutex g_num_mutex;
 
void slow_increment(int id)
{
    for (int i = 0; i < 3; ++i) {
        g_num_mutex.lock();
        ++g_num;
        std::cout << id << " => " << g_num << '\n';
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    for (int i = 0; i < 3; ++i)
    {
        g_num_mutex.unlock();
    }
}
 
 
 
int main()
{
    std::thread t1(slow_increment, 0);
    std::thread t2(slow_increment, 1);
    t1.join();
    t2.join();
}

//尝试获得锁

#include <iostream>
#include <mutex>
 
int main()
{
    std::recursive_mutex test;
    if (test.try_lock()==true) {
        std::cout << "lock acquired" << std::endl;
        test.unlock();      // 现在锁定互斥    
    } else {
        std::cout << "lock not acquired" << std::endl;
    }
 
    test.lock();    // 再锁定它
    if (test.try_lock()) {  // 可留下 true
        std::cout << "lock acquired" << std::endl;
    } else {
        std::cout << "lock not acquired" << std::endl;
    }
    test.unlock(); 
}


std::recursive_timed_mutex(C++11),递归锁的加时版本
std::shared_mutex(C++17),共享互斥锁,允许多个线程共享锁(lock_shared()系列),但只有一个线程能够持有互斥锁(lock()系列),也就是一般所说的读写锁
std::shared_timed_mutex(C++14),共享互斥锁的加时版本。该版本先于不加时的,因为当时赶着把共享互斥锁加进标准来不及了

标签:std,lock,常见,c++,几种,互斥,mutex,test,include
From: https://www.cnblogs.com/52ld/p/17198223.html

相关文章

  • 【C++】网上购书平台完善
    问题描述收到了一份室友已经完成的网上购书平台程序,对其功能使用和熟悉后,进行了部分功能的添加,使其更加完善。程序概况书店登录界面  部分功能展示    ......
  • vim中常见的指令
    一:快速跳转1.1跳转到vim的首行:gg//输入小写的gg,终端直接跳转到vim编辑器的首行1.2跳转到vim的末尾行:G//输入大写的G,vim编辑器默认跳转到最后一行二:删除某些内容/......
  • c++移动构造函数
    一.介绍1.1 定义【源对象资源的控制权全部移交给目标对象】有些复制构造是必要的,我们确实需要另外一个副本;而有些复制构造是不必要的,我们可能只是希望这个对象换个地方,......
  • Winform 几种计时器的区别
    1.System.Windows.Forms.Timer:实现机制:使用消息循环机制实现,即通过向消息队列中添加WM_TIMER消息实现定时器的触发。精度:精度一般较低,定时器的最小间隔为15毫秒,不够......
  • c++ 性能分析
    本文记录下日常工作中用到的性能分析工具。一、内存泄漏排查我的服务依赖了jemalloc,这个地方记录下使用jemalloc进行内存分析的方法。1编译jemalloc首先,依赖的je......
  • 常见dos命令
    打开cmd的方式开始—系统—命令提示符win+R键,输入cmd打开控制台(推荐使用)在任意文件夹下面,按住shift键+鼠标右键点击,选择在此处打开命令行窗口在资源管理器的地......
  • 计算机那点事 - Mac常见的文件后缀名
    Mac文件后缀名.DocumentRevisions-V100:应用程序用来保存和检索文档的不同版本的MacOS版本数据库.fseventsd:是Mac系统在分区里自动建立的系统文件夹。因此这个硬盘......
  • 【C++】购书系统问题测试&功能补充
    代码来源:舍友大一的C++作业【代码存在的问题】在菜单界面选择对应序号时,若输入值非数字,而是字母等其它符号,会导致程序陷入循环,无法正常进入功能的下一步     ......
  • [Primer] 第 14 章 C++ 中的代码重用
    第14章C++中的代码重用14.1包含对象成员的类类初始化列表中有多个项目时,初始化的顺序为在类中的声明顺序而不是列表顺序。14.2私有继承使用私有继承,基类的所有公......
  • gcc 编译 C/C++ 文件
    gcc编译C/C++文件众所周知,C/C++程序想要得到执行,主要需要执行编译和链接两个过程,这个过程比较繁琐,尤其是程序使用到了其他的头文件的时候。gcc是常用的编译工具,其流程主要......