atomic 注释26:测试模板类 atomic<T> 的成员函数 is_lock_free ()、load ()、类型转换函数 operator T ()、睡眠等待 wait ()

(72)测试一个该类的成员函数 is_lock_free ()

在这里插入图片描述

++ 测试结果如下,对于 c++ 里规定的基础类型,都是免自旋锁的。因为对于 64 位 intel CPU ,aL aH ax eax rax 完全有对应的汇编指令来原子性完成对寄存器的操作

在这里插入图片描述

(73)关于原子性的读取 atmoic《T》 中数据的测试,查看 load() 函数的返回值的类型是值传递还是左值引用

在这里插入图片描述

++ 疑问的原因在于源代码里 _Ty 的类型

在这里插入图片描述

++ 查看 atomic《T》:: load()调用的其父类源代码,可以解开这个异或:

在这里插入图片描述

(74) 测试其 类型转换函数 operator T ( )

在这里插入图片描述

(75)函数 atomic《T》:: wait (),需要被 对应的 notify()唤醒,但原子量的值等于形参 1 ,还是会继续睡眠的

在这里插入图片描述

++ 其父类的源代码如下

在这里插入图片描述

++ 测试一下:

在这里插入图片描述

(76)

谢谢

#include "../utils.h" #include "StringLengthVariance.h" #include <algorithm> #include <vector> std::vector<std::shared_ptr<StringBase>> StringLengthVariance::mutated_elements; StringLengthVariance::StringLengthVariance(std::shared_ptr<StringBase> obj, std::mt19937 &rand) : IntegerVariance(std::static_pointer_cast<StringBase>(obj), rand, false) {} std::pair<int64_t, int64_t> StringLengthVariance::get_limits(std::shared_ptr<StringBase> obj) { /* TODO:获取长度边界代码待完善 */ int64_t max_output_size_bits = static_cast<int64_t>(obj->mutator_config.max_output_size * 8); int64_t size_bits = llrint(obj->calculate_bit_size()); int64_t limit_bits = std::max(max_output_size_bits, size_bits); int64_t limit_bytes = (limit_bits + 7) / 8; int64_t max_length = limit_bytes; if (obj->max_length != nullptr) { max_length = std::min(limit_bytes, static_cast<int64_t>(obj->max_length.value())); } int64_t min_length = 0; if (obj->min_length.has_value()) { min_length = std::max(0LL, static_cast<int64_t>(obj->min_length.value())); } return {min_length, max_length}; } int64_t StringLengthVariance::get_value(std::shared_ptr<StringBase> obj) { return std::min(static_cast<int64_t>(obj->value.size()), max_); } void StringLengthVariance::perform_mutation(std::shared_ptr<StringBase> obj, int64_t value) { obj->mutated_value = expand(obj->value, static_cast<size_t>(value)); obj->mutated = true; mutated_elements.push_back(obj); } bool StringLengthVariance::supported(std::shared_ptr<StringBase> obj) { return std::dynamic_pointer_cast<StringBase>(obj) != nullptr; } std::vector<std::shared_ptr<StringBase>> StringLengthVariance::get_mutated_elements() { return mutated_elements; }报错/data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp: In member function ‘virtual std::pair<long int, long int> StringLengthVariance::get_limits(std::shared_ptr<StringBase>)’: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:24:25: error: request for member ‘has_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 24 | if (obj->max_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:25:81: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 25 | max_length = std::min(limit_bytes, static_cast<int64_t>(obj->max_length.value())); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:28:25: error: request for member ‘has_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 28 | if (obj->min_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:29:73: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 29 | min_length = std::max(0LL, static_cast<int64_t>(obj->min_length.value())); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp: At global scope: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:48:42: error: no declaration matches ‘std::vector<std::shared_ptr<StringBase> > StringLengthVariance::get_mutated_elements()’ 48 | std::vector<std::shared_ptr<StringBase>> StringLengthVariance::get_mutated_elements() { | ^~~~~~~~~~~~~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:48:42: note: no functions named ‘std::vector<std::shared_ptr<StringBase> > StringLengthVariance::get_mutated_elements()’ In file included from /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:6: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.h:13:7: note: ‘class StringLengthVariance’ defined here 13 | class StringLengthVariance : public IntegerVariance { | ^~~~~~~~~~~~~~~~~~~~
07-01
.h文件: #pragma once #include <functional> #include <chrono> #include <mutex> #include <condition_variable> #include <thread> #include <queue> #include <unordered_map> #include <atomic> #include <memory> class MessageHandler { public: using Runnable = std::function<void()>; using MessageToken = void*; MessageHandler(); ~MessageHandler(); // 模板方法支持任意可调用对象 template<typename Callable> bool postDelayed(Callable&& callable, long delayMillis) { if (!running_) { return false; } auto token = generateToken(); auto now = std::chrono::steady_clock::now(); auto when = now + std::chrono::milliseconds(delayMillis); { std::lock_guard<std::mutex> lock(queueMutex_); messageQueue_.push({when, Runnable(std::forward<Callable>(callable)), token}); tokenMap_[token] = true; } condition_.notify_one(); return true; } template<typename Callable> bool post(Callable&& callable) { return postDelayed(std::forward<Callable>(callable), 0); } void removeCallbacks(MessageToken token); void removeCallbacksAndMessages(); void stop(); private: struct Message { std::chrono::steady_clock::time_point when; Runnable runnable; MessageToken token; bool operator>(const Message& other) const { return when > other.when; } }; std::atomic<bool> running_; std::thread workerThread_; std::mutex queueMutex_; std::condition_variable condition_; std::priority_queue<Message, std::vector<Message>, std::greater<Message>> messageQueue_; std::unordered_map<MessageToken, bool> tokenMap_; void workerLoop(); MessageToken generateToken(); }; cpp文件: #include "MessageHandler.h" #include <iostream> MessageHandler::MessageHandler() : running_(true) { workerThread_ = std::thread(&MessageHandler::workerLoop, this); } MessageHandler::~MessageHandler() { stop(); } void MessageHandler::stop() { if (running_.exchange(false)) { condition_.notify_all(); if (workerThread_.joinable()) { workerThread_.join(); } } } void MessageHandler::removeCallbacks(MessageToken token) { std::lock_guard<std::mutex> lock(queueMutex_); tokenMap_.erase(token); } void MessageHandler::removeCallbacksAndMessages() { std::lock_guard<std::mutex> lock(queueMutex_); while (!messageQueue_.empty()) { messageQueue_.pop(); } tokenMap_.clear(); } void MessageHandler::workerLoop() { while (running_) { std::unique_lock<std::mutex> lock(queueMutex_); if (messageQueue_.empty()) { condition_.wait(lock); continue; } const auto& nextMessage = messageQueue_.top(); auto now = std::chrono::steady_clock::now(); if (nextMessage.when > now) { auto waitTime = nextMessage.when - now; condition_.wait_for(lock, waitTime); continue; } Message message = nextMessage; messageQueue_.pop(); if (tokenMap_.find(message.token) != tokenMap_.end()) { tokenMap_.erase(message.token); lock.unlock(); try { message.runnable(); } catch (const std::exception& e) { std::cerr << "Handler: Exception in runnable: " << e.what() << std::endl; } lock.lock(); } } } MessageHandler::MessageToken MessageHandler::generateToken() { static std::atomic<uint64_t> counter{0}; return reinterpret_cast<MessageToken>(++counter); }上面代码可能死锁或者其他问题,给出修改后的完整代码
10-22
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问题,并提供完整的Matlab代码实现。文章结合数据驱动方法与Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模与线性化处理,从而提升纳米级定位系统的精度与动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计与优化,适用于高精度自动化控制场景。文中还展示了相关实验验证与仿真结果,证明了该方法的有效性和先进性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模与线性化提供一种结合深度学习与现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模与模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注数据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统数据进行迁移验证,深化对方法泛化能力的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值