域名没过期 网站打不开怎么办仿花瓣 wordpress

张小明 2026/1/14 0:13:28
域名没过期 网站打不开怎么办,仿花瓣 wordpress,宿迁手机网站开发公司电话,深圳网站设计张兵综合我之前学过的异步日志库#xff0c;流的缓冲区以及TensorRT里sample的日志设计。总结出了一套流式异步日志。 参考文章#xff1a; C笔记#xff1a;实现小型日志系统-CSDN博客 TensorRT笔记#xff08;2#xff09;#xff1a;解析样例中Logger日志类的设计-CSDN…综合我之前学过的异步日志库流的缓冲区以及TensorRT里sample的日志设计。总结出了一套流式异步日志。参考文章C笔记实现小型日志系统-CSDN博客TensorRT笔记2解析样例中Logger日志类的设计-CSDN博客C笔记std::stringbuf_修改std::string的缓存区-CSDN博客异步日志这部分和小型日志系统那块基本一样//MyLogger.h #pragma once #includethread #include mutex #include condition_variable #include atomic #include queue #includeiostream #includefstream #includesstream #includechrono #include map enum class LogLevel { INFO, DEBUG, WARN, ERR, }; class LogQueue { public: void push(const std::string msg); bool pop(std::string msg); void shutdown();//关闭 private: std::queuestd::string queue; std::mutex mtx; std::condition_variable cond_var; std::atomicbool is_shutdown false; }; class LogSystem { public: static LogSystem GetInstance() { static LogSystem instance; return instance; } ~LogSystem(); void log(const LogLevel level, const std::string msg) { //加入时间 auto now std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); std::tm tm; localtime_s(tm, now); std::ostringstream ts; ts std::put_time(tm, %Y-%m-%d %H:%M:%S); //根据格式化构造写入的字符串 std::string result [ ts.str() ][ level_string[level] ] msg; log_queue.push(result); } private: LogSystem(); LogSystem(const LogSystem) delete; LogSystem operator(const LogSystem) delete; std::mapLogLevel, std::string level_string; LogQueue log_queue; std::thread work_thread; std::ofstream log_file; std::atomicbool exit_flagfalse; inline static const char* filename Log.txt; };//MyLogger.cpp #include MyLogger.h void LogQueue::push(const std::string msg) { { std::lock_guardstd::mutex lock(mtx); if (is_shutdown) { throw std::runtime_error(LogQueue has been shut down!); } queue.push(msg); } cond_var.notify_one(); } bool LogQueue::pop(std::string msg) { { std::unique_lockstd::mutex lock(mtx); cond_var.wait(lock, [this]() { return !queue.empty() || is_shutdown; }); if (is_shutdown queue.empty()) return false; msg queue.front(); queue.pop(); } return true; } void LogQueue::shutdown() { is_shutdown true; cond_var.notify_all(); } LogSystem::~LogSystem() { exit_flag true; log_queue.shutdown(); if (work_thread.joinable()) { work_thread.join(); } if (log_file.is_open()) { log_file.close(); } } LogSystem::LogSystem() :log_file(filename, std::ios::out | std::ios::app) { if (!log_file.is_open()) { throw std::runtime_error(Failed to open log file); } level_string { {LogLevel::INFO,info}, {LogLevel::DEBUG,DEBUG}, {LogLevel::WARN,WARN}, {LogLevel::ERR,ERROR} }; work_thread std::thread([this]() { std::string msg; while (log_queue.pop(msg)) { //这里就不打换行了默认流里面会有 log_file msg std::flush; } }); }流式设计这一块种缓冲区和stringbuf里的示例也基本一样流的设计参考TensorRT的设计class LogBuffer :public std::stringbuf { public: explicit LogBuffer(LogLevel level):mLevel(level) { } ~LogBuffer() { if (pbase() ! pptr()) { putOutput(); } } int sync()override { putOutput(); return 0; } private: LogBuffer(const LogBuffer) delete; LogBuffer operator(const LogBuffer) delete; void putOutput() { //关键这里丢给异步日志 LogSystem::GetInstance().log(mLevel, this-str()); this-str(); } LogLevel mLevel; }; class LogStream :public std::ostream { public: explicit LogStream(LogLevel level) : std::ostream(nullptr), buf(level) { rdbuf(buf); } private: LogBuffer buf; }; //最后定义了这四个日志等级的宏 #define LOG_INFO LogStream(LogLevel::INFO) #define LOG_DEBUG LogStream(LogLevel::DEBUG) #define LOG_WARN LogStream(LogLevel::WARN) #define LOG_ERR LogStream(LogLevel::ERR)rdbuf// 获取当前 streambuf std::streambuf* rdbuf() const; // 设置新的 streambuf返回旧的 std::streambuf* rdbuf(std::streambuf* sb);使用测试int main() { auto f []() { LOG_INFO hello 1 std::endl; }; std::thread t1(f), t2(f); t1.join(); t2.join(); }[2025-12-14 16:57:09][info] hello1 [2025-12-14 16:57:09][info] hello1设计思想为什么要做成流式这个其实没有为什么用C笔记实现小型日志系统-CSDN博客里面的函数接口依然能做到异步日志。做成流只是为了好看。当然实际上还是方便了一点不用每次都选择日志等级而是直接使用对应的宏即可。并且如果要获取__FILE____LINE__等信息宏因为不会设计函数调用过程也更精准。宏的设计这里比较关键我们写的这几个宏对应的日志流对象都是临时的。作用域结束后/或者接收了std::endl等就会把内容丢到日志队列里去。为什么不做成全局的日志对象这是最关键的问题。答案是不能这样做。如果做成像std::cout那样的全局对象。那么多个线程同时用流的方式往里写就会出问题。因为都是对同一个流对象写那就会出现混乱对操作加锁就像TensorRT那样。答案也是不行。因为加锁只能保证一次的原子性。不能保证多线程的顺序性多线程之间的数据还是会混杂。如果要对整个流对象加锁那反而丢失了性能完全不如临时流对象的效果。临时流对象之间是没有任何约束的只有在push到日志队列的时候会竞争一下队列的锁。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

静态网站跟动态的区别全屏网站源码

还在为Windows 11启动缓慢、操作卡顿而烦恼?系统预装的大量无用应用和后台服务正在悄悄消耗你的电脑资源。本文将带你通过系统精简工具,一键优化Windows 11性能,让电脑重获新生。 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&…

张小明 2026/1/9 18:25:34 网站建设

查询网站备案进度查询有区域名和主机怎么做网站

【2025网络安全趋势】从小白到专家:网安工程师入行指南(建议收藏) 文章详述2025年网络安全工程师入行路径,涵盖三大核心职责方向、需求薪资前景及权威认证报考指南。数据显示网安岗位需求年增37%,薪资上限高&#xff…

张小明 2026/1/1 22:17:07 网站建设

山西建设机械网站国外空间怎么上传网站

LobeChat能否实现AI故事续写?创意写作激发灵感 在数字创作的浪潮中,越来越多的写作者开始面临一个共同困境:灵感枯竭、文风断层、设定空洞。即便是经验丰富的作家,在面对长篇小说或复杂世界观构建时,也常常需要反复推敲…

张小明 2026/1/9 18:42:11 网站建设

南宁 建网站个人域名可以做KTV网站吗

Exposed框架终极指南:15分钟快速上手Kotlin ORM开发 【免费下载链接】Exposed Kotlin SQL Framework 项目地址: https://gitcode.com/gh_mirrors/ex/Exposed 你是否正在寻找一款真正适合Kotlin语言的SQL框架?Exposed作为JetBrains官方推出的Kotli…

张小明 2026/1/8 5:17:22 网站建设

做风险投资网站自己做网站哪里最好

BetterNCM插件终极安装指南:快速美化网易云音乐体验 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 想要让网易云音乐播放器焕然一新吗?BetterNCM插件正是你需要…

张小明 2026/1/3 2:07:15 网站建设

青岛网站设计建设在吗做网站商城

5分钟掌握Typst数学符号:从乱码到专业的终极排雷指南 【免费下载链接】typst A new markup-based typesetting system that is powerful and easy to learn. 项目地址: https://gitcode.com/GitHub_Trending/ty/typst 你是否曾在Typst中折腾半天,…

张小明 2026/1/7 6:22:03 网站建设