确保真正的线程安全——微软为什么不提供线程安全库

Microsoft Agent Framework 1.0:.NET原生AI智能体开发实战 AI智能体(Agent)是当前大模型应用的核心范式,指具备目标导向、上下文感知与工具调用能力的自主行为单元。其底层原理依赖于标准化的聊天接口(如IChatClient)、结构化提示工程(Instructions)与可序列化函数(AIFunction)机制,技术价值在于将非确定性LLM调用转化为可测试、可配置、可编排的.NET工程组件。典型应用场景包括客服工单分派、多角色协同分析、金融报告生成等需强逻辑控制与合规审计的业务系统。本文聚焦Microsoft Agent Framework 1.0这一微软官方推出 阅读详情
线程安全在高并发情况下是一个非常严重的问题。以下代码在多线程访问时,会出现问题。我们以List.Add为例,来说明在多线程访问下的状况。以下代码是List.Add的实现。
 
public   void  Add(T item) {      if  ( this ._size  ==   this ._items.Length)  this .EnsureCapacity( this ._size  +   1 );      this ._items[ this ._size ++ ]  =  item;      this ._version ++ ; }

当两个线程同时访问一个List的Add方法时,这个方法的第一条指令就可能出现不一致性了。因为,此时两个线程访问时_size都是一样的,正确情况下List应该执行EnsureCapacity(this._size + 2)而不再是EnsureCapacity(this._size + 1)了。为了确保List的线程安全,我们必须保证在任意时刻只能有一个线程来更改List的数据。这样我们的SimpleThreadSafeList就诞生了,在这个List中我们对其的每一个读写操作都加上一个排它锁。

public   class  SimpleThreadSafeList < T >  : IList < T >
{
    
private  List < T >  _data;
    
private   object  _syncRoot  =   new   object ();
    
public  SimpleThreadSafeList()
    {
        _data 
=   new  List < T > ();
    }
    
public   void  RemoveAt( int  index)
    {
        
lock  (_syncRoot)
        {
            _data.RemoveAt(index);
        }
    }
    
public   void  Add(T item)
    {
        
lock  (_syncRoot)
        {
            _data.Add(item);
        }
    }
    
//  others......
}

这样我们确保List的数据在任意时刻都只有一个线程对其进行访问,看起来安全很多了。不过,如果所谓线程安全是这么简单的话,微软为什么不提供一个ThreadSafeList呢?JaredPar MSFT在这篇文章中做了一个描述《Why are thread safe collections so hard?http://blogs.msdn.com/b/jaredpar/archive/2009/02/11/why-are-thread-safe-collections-so-hard.aspx》,他解释微软不实现线程安全集合类,是因为以上这样的所谓“线程安全”并不是真正安全,我们可以从以下的代码中看出端倪。

var list  =   new  SimpleThreadSafeList < int > ();
//  ohters …
if (list.Count  >   0 )
{
    
return  list[ 0 ];
}

在以上代码中,我们创建了SimpleThreadSafeList这个类,其中有一个代码段就是用于获取list的默认值。如果有多个线程访问这段代码时,依然会出现数据不一致问题。即在执行“return list[0]”这条语句是,它是以“list.Count > 0”为前提的,当两个线程同时对这个SimpleThreadSafeList操作时,当前线程访问到list.Count大于0,但之后可能另一个线程将list清空了,这时候当前线程再来返回list[0]时就会出现IndexOutofRangeException了。SimpleThreadSafeList保证了List内部数据只能由一个线程来操作,但是对于上面的代码,它是无法保证数据不一致的。SimpleThreadSafeList仅能够被称为“数据线程安全”,这也是微软不提供线程安全集合类的原因了。JaredPar MSFT提出了一个真正解决线程安全的方法。那就是将SimpleThreadSafeList的_syncRoot 暴露出来。

public   class  SimpleThreadSafeList < T >  : IList < T >
{
    
private   object  _syncRoot  =   new   object ();
    
public   object  SyncRoot
    {
        
get
        {
            
return  _syncRoot;
        }
    }
    
//  others……
}

使用List时,需要使用到SyncRoot来加锁。 

lock (list.SyncRoot)
{
    
if (list.Count  >   0 )
    {
        
return  list[ 0 ];
    }
}

不过,使用这种方式,有几个缺陷。第一,没有一个良好的Guide来指导编写线程安全的代码;第二,当SyncRoot使用范围过大时,非常容易造成死锁。下面是一段可能产生死锁的代码。 

var list1  =   new  SimpleThreadSafeList < int > ();
var list2 
=   new  SimpleThreadSafeList < int > ();

new  Thread(() =>  
    {
       
lock (list1.SyncRoot)
       {
           list2.Add(
10 );  // 间接请求了list2.SyncRoot
       } 
    }).Start();

new  Thread(() =>  
    {
       
lock (list2.SyncRoot)
       {
           list1.Add(
10 );  // 间接请求了list1.SyncRoot
       } 
    }).Start();

对于死锁这个问题,我们采取的方法是使用Monitor.TryEnter,从而来避免一直死锁。对于前一个问题,我这边仅是基于DisposableLocker来实现尽可能的线程安全,对于如何使用,我目前依然没有一个良好的理论,只能说我们在设计高并发的API时,对多个线程可以同时访问的对象都需要加以判断从而来确定需要采用什么样的方式处理。

namespace  UIShell.OSGi.Collection
{
    
///   <summary>
    
///  Use Monitor.TryEnter to acquire a lock. This would not cause the dead lock.
    
///   </summary>
     public   class  DisposableLocker : IDisposable
    {
        
private   object  _syncRoot;
        
private   bool  _lockAcquired;
        
private   int  _millisecondsTimeout;
        
public  DisposableLocker( object  syncRoot,  int  millisecondsTimeout)
        {
            _syncRoot 
=  syncRoot;
            _millisecondsTimeout 
=  millisecondsTimeout;
            _lockAcquired 
=  Monitor.TryEnter(_syncRoot, _millisecondsTimeout);
            LogWhenAcquireLockFailed();
        }
        
private   void  LogWhenAcquireLockFailed()
        {
            
if  ( ! _lockAcquired)   // 这时候可能要如下处理:(1)记录日志;(2)记录日志并抛出异常;(3)记录日志,然后Block,重现死锁。
            {
                FileLogUtility.Error(
string .Format(
                    
" Accquire the lock timeout. The limited time is {0} milliseconds. " , 
                    _millisecondsTimeout
                    ));
            }
        }
        
public   void  Dispose()
        {
            Dispose(
true );
            GC.SuppressFinalize(
this );
        }
        
private   void  Dispose( bool  disposing)
        {
            
if  (disposing)
            {
                
if  (_lockAcquired)
                {
                    Monitor.Exit(_syncRoot);
                }
            }
        }
        
~ DisposableLocker()
        {
            Dispose(
false );
        }
    }
}

当出现死锁时,这里采用的解决方案是记录日志,然后继续运行。不过,这种方法有一定缺陷,可能在极端情况下引起数据不一致。因此,我们可能需要抛出异常或者让锁一直持续下去。SimpleThreadSafeList此时将以以下方式来实现。

public   class  SimpleThreadSafeList < T >  : IList < T >
{
    private   object  _syncRoot  =   new   object ();
    public   object  SyncRoot
    {
        get
        {
            return  _syncRoot;
        }
    }
    public   int  MillisecondsTimeoutOnLock {  get ;  private   set ; }
    public  DisposableLocker CreateLocker()
    {
        return   new  DisposableLocker(MillisecondsTimeoutOnLock, SyncRoot);
    }
    public   void  Add(T item)
    {
        using (CreateLocker())
        {
            _data.Add(item);
        }
    }
    //  others……
}

接下来使用List.CreateLocker来建立一个全局锁

using (list.CreateLocker())
{
    if (list.Count  >   0 )
    {
        return  list[ 0 ];
    }
}

大家可以看一下是否还有更好的方式来保证线程绝对安全。

 

原文地址:http://www.cnblogs.com/baihmpgy/archive/2011/07/13/2105018.html

UI自动化 线程安全问题1 是一个在Windows平台上使用的COM(Component Object Model)初始化函数。COM是微软开发的一种用于跨应用程序边界进行对象交互的技术。函数用于初始化COM库,设置线程的并发模型(单线程、多线程、单元线程等)。这是在使用COM对象之前必须执行的操作,以确保COM库能够在当前线程中正确运行。在Python中,如果你需要调用Windows的COM组件(例如,操作Excel、Word等Office应用程序),你也需要初始化COM库。这是因为Python本身并不直接支持COM,但是通过像这样 阅读详情

相关推荐

微软开源项目 Detours 详细介绍与使用实例分享

本文详细介绍微软开源库Detours,并分享使用Detours实现函数hook的实例。

dvlinker的技术专栏 1万+

Java并发 | 常见线程安全容器

线程安全数据类型通常提供了一些同步机制来保证数据的一致性。这些机制可以包括锁、互斥量、原子操作、无锁算法等。会在多个线程同时访问数据时进行同步操作,以保证每个操作的原子性和正确性。

devops 2043

【Python】SimpleITK使用笔记

1. 概念 1.1 nii格式 1.2 SimpleITK 1.3 SimpleITK 图像 2. 基本操作 2.1 常见属性 2.1 读取和保存图像 2.2 SimpleITK图像数据和Numpy矩阵数据之间的转换

See_Star的博客 7898

Linux线程篇(下)

有了之前对线程的初步了解我们学习了什么是线程,线程的原理及其控制。这篇文章将继续讲解关于线程的内容以及重要的知识点。

m0_69005269的博客 1215

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

UE5网络模块实战:属性复制、RPC与联机开发踩坑指南

多人联机开发中,网络同步是核心难题。UE5网络模块以服务器权威为基础,通过Actor复制、RPC和所有权机制实现多端状态一致。理解属性复制与OnRep回调、区分Server/Client/Multicast RPC的适用场景,是构建稳定联机架构的关键。本文结合数字孪生与多端协作场景,探讨如何将渲染与逻辑分离,并针对打包后网络失效、端口防火墙、崩溃排查等工程实践问题给出解决方案。通过蓝图接口解耦表现层,利用C++创建StaticMesh组件实现服务器逻辑与客户端表现分离,同时注意专用服务器不加载渲染依赖(如D

weixin_29010003的博客 272

C++11写的线程安全STL库

用C++写的程序,如果用到了自带的标准模板库STL,在多线程访问的时候如果不加锁很容易造成segment fault导致程序崩溃coredump,这个问题是C++语言开发挥之不去的meng'yan

踏莎行的博客 2490

学Simulink——基于软开关与高频变换的整流器系统场景实例:移相全桥ZVS整流器在轻载条件下的效率优化

本文以Simulink为平台,详细介绍了移相全桥ZVS整流器在轻载条件下的建模与优化方法。通过六个步骤系统讲解了从项目创建到仿真运行的全过程,重点分析了移相全桥拓扑结构、ZVS检测逻辑设计及轻载特性。结果显示,传统移相全桥在轻载时ZVS失效导致效率下降(<88%)。针对此问题,提出了动态频率调整、不对称半桥模式等优化策略。该案例为理解软开关技术、提升电源效率提供了实用建模方法和优化思路。

xiaoheshang_123的博客 117

几种Java常用序列化框架的选型与对比

一 背景介绍序列化与反序列化是我们日常数据持久化和网络传输中经常使用的技术,但是目前各种序列化框架让人眼花缭乱,不清楚什么场景到底采用哪种序列化框架。本文会将业界开源的序列化框架进行对比测试,分别从通用性、易用性、可扩展性、性能和数据类型与Java语法支持五方面给出对比测试。通用性:通用性是指序列化框架是否支持跨语言、跨平台。易用性:易用性是指序列化框架是否便于使用、调试,会影响开发效率。可扩展...

十指波课堂的博客 791

【论文硬核拆解】Ctx2Skill:让大模型自己跟自己玩,从上下文里「进化」出可复用技能

论文选择自然语言技能可解释性:技能是人类可读的 Markdown 文件,可以审查、编辑、调试可迁移性:即插即用,从一个模型到另一个模型无需参数访问:对闭源模型友好这比 SKILL0/SkillRL 等参数内化方法更实用,尤其是在商业 API 场景。

步子哥的博客 154

YOLO26 数据标注工具:LabelImg、Label Studio实战指南:主流标注工具的安装配置与使用技巧,高效完成目标检测数据标注

本文介绍了目标检测中数据标注的核心地位与常用工具。数据标注质量直接影响模型性能,需要关注准确性、一致性等维度。文章详细讲解了边界框、类别标签等基本概念,并对比了LabelImg、Label Studio等主流标注工具的特点。重点介绍了LabelImg的轻量级、易用性等优势,以及Label Studio的协作功能,为不同规模项目提供标注工具选择建议。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1176

探索Detours:微软开源的动态代码拦截库

是微软开发的一个开源库,它允许开发者轻松地修改其他进程中的函数调用行为,而无需重新编译或修改原始代码。这使得 Detours 成为了调试、监控和系统研究的强大工具。 ## 项目简介 Detours 使用钩子(hook)技术,可以在运行时“绕道”目标函数,将控制流转向自定义的处理函数,然后在适当的时候再恢复到原函数的执行。这种功能使得开发人员可以方便地对已有的应用程序进行扩展,例如添加日志记录、...

gitblog_00063的博客 727

RK3568下MIPI屏幕调试技巧

通过合理配置设备树节点、精确计算像素时钟并完成编译烧录,可高效实现RK3568平台MIPI屏幕的点亮与显示调试。关键在于严格遵循屏幕规格书参数,结合内核日志定位问题,逐步优化时序配置。掌握这一流程后,开发者可快速适配不同分辨率、刷新率的MIPI屏幕,为嵌入式系统显示模块开发奠定基础。如果在调试中遇到特定问题(如驱动匹配失败、时钟计算误差),建议优先查阅屏幕规格书和RK3568芯片手册,或通过内核社区(如Linux-DRI邮件列表)获取支持。

文石_2009的博客 1204

c#集合类的线程安全(整理)

QueueT> 类 MSDN的说法 线程安全 此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。但不能保证任何实例成员是线程安全的。 只要不修改该集合,QueueT> 就可以同时支持多个阅读器。即便如此,从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。 若要确保枚举过程中的线程安全,可以在整个枚举过程中锁定

蓝叶菱的专栏 4万+

【即插即用模块】Transformer篇 | CVPR 2025 | D2T:双域特征融合,完美适配缺陷检测/小目标检测和分割等频域细节敏感的任务!

本文提出了一种基于小波和原型增强的双域Transformer(WPFormer)用于像素级表面缺陷检测。该模型通过Dual-domain Transformer (D2T)模块融合频域和空间域特征:小波增强交叉注意力(WCA)分解高低频特征并加权平衡,增强缺陷细节捕捉;原型引导注意力(PCA)生成全局原型向量强化关键信息聚合。实验表明,该模块在缺陷检测任务中性能优于现有方法,通过频域细节增强和全局依赖建模有效提升了复杂场景下的检测效果。代码已开源,适用于对频域敏感的目标检测和分割任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1374

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

php连接微软MSSQL完全攻略

在研究ezSQL的时候就看到了mssql_connect()等一些php提供的连接MSSQL的函数,本以为php这个开源的风靡世界的编程语言对连接微软的数据应该是不在话下的,但是到真正执行的时候,才发现困难多多。 一开始我下载的php版本是5.93的,下载下来添加环境变量等等搞了半天后,phpinfo()这个函数终于成功的运行在浏览器中了。然后当我在满世界的找php_mssql.dll,才发

吵吵博客 617

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

深入浅出GUI线程安全(一)

原文链接 http://twaver.servasoft.com/?p=531 作为一名TWaver Evangelist,我的工作目的就是通过与客户的交流、培训甚至现场支持等方式帮助用户将TWaver更好地应用到客户项目中,TWaver是这么一款横跨Java、Web、Flex和.NET等多种技术平台的GUI图形组件,因此我的工作内容简单的说就是:帮助客户正确使用GUI。 提到GUI线...

subnetwork的专栏 334

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

微软计划使用 Rust 取代 C和C+

新智元推荐 来源:InfoQ 作者:王文婧 【新智元导读】微软近日提出,未来将使用 Rust 作为 C、C++ 以及其他编程语言的替代方案,以改善应用程序的安全性的计划。 近日,微软安全响应中心(MSRC)团队在官网更新文章,就近日提出的最新计划,即未来将使用 Rust 作为 C、C++ 以及其他编程语言的替代方案以改善应用程序的安全性的计划,从空间内存安全、时间内存安全、数据竞...

ctrigger的专栏 5674

[.Net] 什么是线程安全的并发集合

System.Collections.Concurrent 为此,在.NET Framework中提供了System.Collections.Concurrent新的命名空间可以访问用于解决线程安全问题,通过这个命名空间能访问以下为并发做好了准备的集合。1.BlockingCollection 与经典的阻塞队列数据结构类似,能够适用于多个任务添加和删除数据,提供阻塞和限界能力。2.Co...

weixin_38170561的博客 496

Microsoft.Extensions完全指南:10个必备库构建企业级.NET应用

Microsoft.Extensions是.NET生态系统中构建生产级应用程序的核心框架集合,提供了企业级开发所需的各类基础设施库。这些库简化了依赖注入、配置管理、日志记录等常见任务,让开发者能够专注于业务逻辑的实现。无论你是刚开始接触.NET的新手,还是正在构建复杂企业系统的资深开发者,掌握Microsoft.Extensions系列库都是提升开发效率和代码质量的关键。 ## 为什么选择Mic

gitblog_00042的博客 917

Microsoft.IO.RecyclableMemoryStream 项目常见问题解决方案

Microsoft.IO.RecyclableMemoryStream 是一个开源项目,旨在提供一个高性能的 .NET MemoryStream 替代方案。该项目的主要目标是优化内存使用,减少垃圾回收(GC)的频率和时间,从而提高应用程序的性能。该项目使用 C# 作为主要的编程语言,适用于 .NET 平台。 ## 新手使用注意事项及解决方案 ### 1. 内存泄漏问题 **问题描述**:新手...

gitblog_01050的博客 1456

php连接sql server教程,php连接微软MSSQL(sql server)攻略

在研究ezSQL的时候就看到了mssql_connect()等一些php提供的连接MSSQL的函数,本以为php这个开源的风靡世界的编程语言对连接微软的数据应该是不在话下的,但是到真正执行的时候,才发现困难多多在研究ezSQL的时候就看到了mssql_connect()等一些php提供的连接MSSQL的函数,本以为php这个开源的风靡世界的编程语言对连接微软的数据应该是不在话下的,但是到真正执行的...

weixin_39568926的博客 474
上一篇: 如何写健壮的代码
下一篇: 随机抽样一致性算法(RANSAC)
jackfirst86
博客等级 码龄18年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值