首页 > 其他分享 >condition_variable ,wait for unique lock and time_duration,notify_all()

condition_variable ,wait for unique lock and time_duration,notify_all()

时间:2023-06-29 17:26:13浏览次数:37  
标签:std now uuid chrono lock notify time duration include

#include <algorithm>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <cstdint>
#include <execution>
#include <fstream>
#include <future>
#include <iomanip>
#include <iostream>
#include <map>
#include <memory>
#include <mutex>
#include <random>
#include <sstream>
#include <thread>
#include <uuid/uuid.h>
#include <vector>

char *uuid_value = (char *)malloc(40);
char *get_uuid_value()
{
    uuid_t new_uuid;
    uuid_generate(new_uuid);
    uuid_unparse(new_uuid, uuid_value);
    return uuid_value;
}

std::string get_time_now()
{
    std::chrono::time_point<std::chrono::high_resolution_clock> now = std::chrono::high_resolution_clock::now();
    time_t raw_time = std::chrono::high_resolution_clock::to_time_t(now);
    struct tm tm_info = *localtime(&raw_time);
    auto seconds = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch());
    auto mills = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
    auto micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());
    auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch());

    std::stringstream ss;
    ss << std::put_time(&tm_info, "%Y%m%d%H%M%S") << "_"
       << std::setw(3) << std::setfill('0') << (mills.count() - seconds.count() * 1000)
       << std::setw(3) << std::setfill('0') << (micros.count() - mills.count() * 1000)
       << std::setw(3) << std::setfill('0') << (nanos.count() - micros.count() * 1000);
    return ss.str();
}


std::mutex _mtx;
std::condition_variable _cv;
bool _is_cv_ok=false;

void action_unique_lock_wait()
{  
    static int num=0;
    while(!_is_cv_ok)
    {
        std::cout<<get_time_now()<<","<<++num<<","<<get_uuid_value()<<std::endl; 
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    } 
    std::cout<<get_time_now()<<",id:"<<std::this_thread::get_id()<<",in:"<<__FUNCTION__<<std::endl;
}

void cv_wait_for(const int&wait_seconds)
{
    std::unique_lock<std::mutex> _lk(_mtx);
    std::cout<<std::boolalpha<<get_time_now()<<",_is_cv_ok:"<<_is_cv_ok<<",in:"<<__LINE__<<std::endl;
    std::thread t1(action_unique_lock_wait);  
    _cv.wait_for(_lk,std::chrono::seconds(wait_seconds));    
    _is_cv_ok=true; 
    _lk.unlock();
    std::cout<<std::boolalpha<<get_time_now()<<",_is_cv_ok:"<<_is_cv_ok<<",in:"<<__LINE__<<std::endl;
    _cv.notify_all(); 
    t1.join();
    std::cout<<get_time_now()<<",id:"<<std::this_thread::get_id()<<",in:"<<__FUNCTION__<<std::endl;
}

int main(int args, char **argv)
{
    cv_wait_for(atoi(argv[1]));
    std::cout<<get_time_now()<<",id:"<<std::this_thread::get_id()<<",in "<<__FUNCTION__<<std::endl;
}
g++-12 -std=c++2a -I. *.cpp -o h1 -luuid -lpthread
./h1 2

 

标签:std,now,uuid,chrono,lock,notify,time,duration,include
From: https://www.cnblogs.com/Fred1987/p/17514701.html

相关文章

  • BitLocker加密过程断电,数据恢复文件打不开
    BitLocker是Windows系统提供的磁盘加密功能,用户自己可以手动开启。在访问受BitLocker保护的磁盘分区时,需要先提供正确的密码、秘钥或是BEK文件。如果使用BitLocker将系统盘加密了,那么需要输入密钥才能进入系统。除了本地的机械硬盘和固态硬盘,BitLocker功能还可以对移动硬盘、U盘等......
  • package-lock.json锁定镜像地址404的处理方法
    前言最近接触了一个新的vue项目,安装依赖是一直无法安装成功,有部分依赖包的地址报404,查看package-lock.json,发现其中部分依赖使用了公司私有的镜像库,但是目前该镜像库已关闭,访问该包地址返回404.解决方案如下1、删除package-lock.json,重新npmi生成新的package-lock.json2、先卸......
  • synchronized中wait、notify的原理与源码
    synchronized中wait、notify的原理与源码1.wait和notify的流程图2.JVM源码java层面wait的方法publicfinalnativevoidwait(longtimeout)throwsInterruptedException;jvm中object.cstaticJNINativeMethodmethods[]={{"hashCode","()I",......
  • inotifywait 监控文件修改实时格式化文件
    我们在学习laravel过程中,从文档网页复制代码,会有一些比较麻烦的问题。以《Laravel10中文文档》|LaravelChina社区(learnku.com)为例 直接点复制按钮会带后,想测试的代码的话,还有处理use语句选中复制时,网站会向剪贴板追加来源信息,还得手动处理。 这些手动处理......
  • 关于SMB协议-Server Message Block-服务器信息块
    SMB:ServerMessageBlock,即服务(器)消息块,是IBM公司在80年代中期发明的一种文件共享协议SMB(全称是ServerMessageBlock)是一个网络协议名,它能被用于Web连接和客户端与服务器之间的信息沟通。SMB最初是IBM的贝瑞·费根鲍姆(BarryFeigenbaum)研制的,其目的是将DOS操作系统......
  • Java线程的WAITING状态和BLOCKED状态之间区别的一点理解
    先说结论:WAITING状态是线程在获取锁对象之后,由于某些原因需要等待一些事件的完成才能继续执行,这时线程调用Object.wait()、Thread.sleep()、Thread.join()等方法进入WAITING状态。而BLOCKED状态则是线程在准备进入某个同步代码块时,发现锁对象已经被其它线程占用了,这时线程就会进入......
  • 【后端面经-Java】Synchronize和ReentrantLock区别
    目录1.概念介绍1.1线程安全锁1.2公平锁1.3响应中断/等待可中断2.区别2.1底层实现2.2锁的用法2.3锁的特点2.4性能比较2.5适用场景3.总结比较参考文献1.概念介绍1.1线程安全锁Synchronize(同步锁)和ReentrantLock(可重入锁)都是Java中的常用锁,都是用来保证线程安全的。......
  • ReentrantLock底层实现原理
    ReentrantLock底层的源码分析:本小节我们将由浅入深的讲解ReentrantLock的底层源码,其中会附带有源码的分析:1.自己实现简易的ReentrantLock锁:在多线程的并发的操作当中,我们需要通过锁机制来实现多个线程互斥的访问特定的资源从而避免并发下的操作问题。我们可以先来看一下Reentra......
  • linux memblock 介绍
    memblock作用内核初始化阶段是用引导内存分配器memblock进行管理,因为内核里面有很多内存结构体,不可能在静态编译阶段就静态初始化所有的这些内存结构体。另外,在系统启动过程中,系统启动后的物理内存分配器本身也需要初始化,如伙伴分配器,那么伙伴分配器如何获取内存来初始化自己......
  • string类型可以作为lock的锁对象吗
    lock关键字介绍lock关键字是用于在多线程编程中实现同步和互斥访问的关键字。它的作用是确保共享资源在任意时刻只能被一个线程访问,从而避免出现竞态条件(racecondition)和数据不一致的问题。当多个线程同时访问共享资源时,如果没有合适的同步机制,可能会导致数据损坏、结果的不......