Linux之线程安全

图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码) 本文介绍了一种基于多尺度Retinex(MSR)和CLAHE的低照度图像增强算法。算法首先对图像进行多尺度Retinex处理,通过不同尺度的高斯核去除光照影响;然后采用CLAHE算法进行对比度增强。Matlab实现展示了算法流程,包含灰度转换、多尺度Retinex增强和CLAHE处理。实验结果显示,该方法能有效提升低照度图像的可见性,增强细节表现。最后提出了改进建议,包括引入深度学习方法和优化参数选择。 阅读详情

上一节我讲了Linux线程的一些基础知识,返现多线程是不安全的,会引发安全问题,所以今天就来讲一下Linux线程安全一节的内容!

1.线程安全概念

线程安全:多个线程同时操作临界资源不会出现数据二义性

2.线程安全的实现

这里要引入两个概念:同步与互斥
同步:临界资源访问的时序可控
互斥:临界资源访同一时间的唯一访问性
临界资源:多线程执行流共享的资源
原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。
可重入/不可重入:多个执行流中是否可以同时进入函数运行而不会出现问题,是否在线程函数中对临界资源进行了非原子操作。

下面来举个例子:(为了举例,当然这是一种理想情况,不可能不存在竞争)
一个系统中多个线程必然要共享一些系统资源,如共享CPU,共享I/O设备。
以打印机为例,线程A在使用打印机时,其他线程不能使用而只能等待,这就是互斥,保证临界资源(打印机)的同一时间的唯一访问性。
线程A用完了,它后面的线程再逐个接着使用,这就是同步,保证临界资源访问的时序可控。

在访问临界资源时会产生资源竞争问题,这就需要实现互斥,那么如何实现互斥呢?
这就需要用到互斥锁(mutex):
互斥锁原理图:
在这里插入图片描述
上图中就用到了互斥锁变量mutex,当一个线程访问临界资源时就加锁,其他线程只能等待,无法访问,等到该线程访问完毕解锁后,其他线程才能继续访问。

互斥锁的操作步骤:(用到的接口)
1.定义互斥锁变量
pthread_mutex_t mutex

2.初始化互斥锁变量
pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
mutex: 要初始化的互斥量
attr:NULL

3.加锁/解锁
pthread_mutex_lock(pthread_mutex_t *mutex);
阻塞加锁:加不上锁就阻塞
pthread_mutex_trylock(pthread_mutex_t *mutex);
非阻塞加锁:加不上锁就报错返回
pthread_mutex_timelock(pthread_mutex_t *restrict mutex,
const struct timespec *restrict abs_timeout)
限时阻塞加锁
pthread_mutex_unlock(pthread_mutex_t *mutex);
解锁
返回值:0 失败:错误号

4.销毁互斥锁
pthread_mutex_destroy(pthread_mutex_t *mutex);

加了锁也不是一定就不会出问题,比如会出现死锁情况如下图!!!
在这里插入图片描述

死锁:因为对一些无法加锁的锁,进行加锁而导致程序卡死
产生:对资源的竞争以及进程/线程加锁的推进顺序不当
死锁产生的四个必要条件:
1.互斥操作(我操作的时候别人不能操作)
2.不可剥夺条件(我加的锁.别人不能解)
3.请求与保持条件(拿着手里的,请求其他的,其他的请求不到,手里的也不放)
4.环路等待条件
产生场景:加锁/解锁顺序不同
预防死锁:破坏必要条件
避免死锁:死锁检测算法,银行家算法

银行家算法:
这个算法为什么叫银行家算法呢?是因为这个算法同样适用于银行的贷款业务。

当一个进程申请使用资源的时候,银行家算法通过先试探分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。< font>

最后通过安全判定算法通过的序列就称为安全序列,这个安全序列就不会产生类似死锁的情况。
假设有进程P1,P2,,,,Pn
则安全序列应该满足:Pi(0<i<n)需要的资源 = 分配给Pj(0<j<i)的资源 + 剩余资源< font>
为什么还要加上分配给Pj的资源呢?你想想银行贷款他总不可能只出不进吧?别人贷了款总要还款的啊。

int n,m    //系统中的进程数n和资源数m
int Avaliable[1..m]         //资源当前可用总量
int Allocation[1...n,1...m]     //当前分配给各个进程的各种资源数
int Need[1...n,1...m]       //当前每个进程还需分配的各种资源数量
int Work[1...m]         //当前可分配的资源
bool Finish[1...n]     //进程是否完成

银行家算法->安全判定算法
1.初始化
Work = Available (动态记录当前剩余资源)
Finish[i] = false (设当前所有进程均未完成)

2.查找可执行的Pi (未完成的话但是剩余资源能满足其需要,这样也算可以完成)
Finish[i] = false
Need[i]<=Work
如果没有这样的进程Pi,就跳转到第4步

3.如果没有 Pi一定可以完成,并归还分配给其的资源
Finish[i] = true
Work = Work + Allocation[i]
继续返回第2步查找

4.如果所有进程Pi都能完成,即Finish[i] = true
则系统处于安全状态,否则是不安全状态

实现伪代码:

Boolean Found;
Work = Available ;
Finish[1..n] = false;
while(true){
	Found = false;
	for(int i=0;i<n;i++){
		if(Finish[i]==false&&Need[i]<=Work){
			Work = Work + Allocation[i];
			Finish[i] = true;
			Found = true;
 		}
	}
	if(Found == false){
		break;
	}
}
for(int i=0;i<n;i++){
	if(Finish[i]==false){
		return "Unfinished"
	}
}

同步的实现:
临界资源的访问合理性—生产出来才能使用,没有资源则等待(死等),生产资源后唤醒等待。
条件变量:例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中。这种情 况就需要用到条件变量。

1.定义条件变量
pthread_cond_t n

2.初始化条件变量
pthread_cond_init(&n)

3.等待/唤醒
pthread_cond_wait(&n,&mutex)
pthread_cond_signal(&n)

4.销毁条件变量
pthread_cond_destroy(&n)

条件变量为什么要搭配互斥锁使用?
因为条件变量本身只提供等待与唤醒功能,具体什么时候等待需要用户来进行判断,这个条件的判断,通常涉及到临界资源的操作(其他线程要通过修改条件,来促使条件满足)而这个临界资源的操作应该收保护,因此搭配互斥锁一起使用。< font>

最后给大家举个例子:(利用同步与互斥)
实现了一个简单的黄牛抢票程序

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<pthread.h>
  5 
  6 int ticket = 100;
  7 pthread_mutex_t mutex;
  8 
  9 void* pth_start(void* arg){//pthread_create 入口函数
 10     while(1){
 11         pthread_mutex_lock(&mutex);//在访问临界资源前加互斥锁
 12         if(ticket>0){
 13             printf("第 %d 黄牛,抢了张票: %d\n",(int)arg,ticket);
 14             ticket--;
 15         }
 16         else{
 17             pthread_mutex_unlock(&mutex);//如果没票了也要解锁,否为后面将会死等
 18             pthread_exit(NULL);
 19         }
 20         pthread_mutex_unlock(&mutex);//一个黄牛抢到票后要解锁,其他的黄牛可以抢票
 21     }
 22     return NULL;
 23 }
 24 
 25 int main(int argc,char* argv[])
 26 {
 27     pthread_t tid[4];
 28     int i=0,ret;
 29     //互斥锁初始化
 30     pthread_mutex_init(&mutex,NULL);
 31     //创建四个线程来充当黄牛抢票
 32     for(;i<4;i++){
 33         ret = pthread_create(&tid[i],NULL,pth_start,(void*)i);
 34         if(ret!=0){
 35             printf("yellowbull not exist!");
 36             return -1;
 37         }
 38     }
 39     //退出线程
 40     for(i=0;i<4;i++){
 41         pthread_join(tid[i],NULL);
 42     }
 43     //销毁互斥锁变量
 44     pthread_mutex_destroy(&mutex);
 45     return 0;
 46 }
 

在这里就用到了互斥锁变量,如果不加互斥锁的话,会出现多个黄牛抢了同一张票,这显然是不合理的,所以在访问临界资源时要加锁,这样每次就是一个黄牛在访问临界资源(抢票),在访问完毕后要解锁,如果没有加完锁后发现没票了,也是要解锁的,否则会导致后面的黄牛死等。

TMS_WebGMaps_1.9.8.0_Full_Source TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder 立即下载

相关推荐

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7709

【Linux】线程安全

因为该执行流第一次申请锁的时候是申请成功的,但第二次申请锁的时候,因为该锁已经被申请过了,于是申请失败,导致被挂起知道该锁被释放时才会被唤醒,但是这个锁本来就在自己手上,自己现在处于被挂起的状态根本没有机会释放锁,所以该执行流永远不会被唤醒,此时该执行流也就处于一种死锁的状态。我们在上述简易抢票系统中引入互斥量,每一个线程要进入临界区之前都必须先申请锁,只有申请到锁的线程才可以进入临界区对临界资源进行访问,并且当下出临界区的时候需要进行解锁,这样才能让其余要进入临界区的线程继续竞争锁。

m0_72940975的博客 344

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 984

Linux —— 线程安全

一、Linux线程互斥1. 进程线程间的互斥相关背景概念1. 临界资源与临界区的理解2. 互斥与原子性的理解2. 互斥量mutex3. 互斥量的接口1. 互斥量初始化2. 互斥量销毁3. 互斥量加锁4. 互斥量解锁5. 互斥量的使用4. 互斥量实现原理探究1. 加锁是如何保证原子性2. 如何保证锁是原子性的二、可重入vs线程安全1. 概念2. 常见的线程不安全的情况3. 常见的线程安全的情4. 常见的不可重入的情况......

M的博客 1923

Hermes V0.10.0:官方UI几乎无Bug版

如果你还在观望Hermes,现在可能是最好的入局时机。 因为网页端来了,门槛降到了最低。 如果你已经是Hermes用户,升级就对了。 因为0.9.0的更新,值得一试。

weixin_66295112的博客 2046

MIPI video mode 和 command mode 的区别

1、何为LCD RAM? LCD 是指字面意思是液晶显示屏(Liquid Crystal Display), 而RAM: 随机存取存储器(Random-Access Memory),两者完全是风马牛不相及的东西。 下图是一个标准的LCD的爆炸图(不含TP),请注意图中红色mark的地方:控制IC-- LCD的大脑。所谓的LCD RAM自然是指此大脑是否包含RAM. 题外话<不感兴趣的...

精诚所至 4690

【Linux】——线程安全

本文主要介绍了linux线程安全方面知识:可重入与线程安全、常见的线程安全情况、常见的可重入和不可重入的情况、linux线程互斥、互斥量mutex接口的使用方法、常见锁的概念、死锁的原理以及如何避免

weixin_69519040的博客 1100

黑猫带你学Nand第11篇:万字长文带你了解NandFlash的数据保持原理及特性(Data Retention)

TATTAT:Trap-assistedtunneling,陷阱辅助隧穿,也有叫法称为电荷陷阱现象。这是一种物理现象,它发生在非挥发性存储器,如NAND闪存。在这种效应中,存储在闪存单元浮动栅极上的电荷(电子)由于隧道氧化物中捕获的电荷形成的电场影响,导致电荷通过隧道效应从一个能级隧穿到另一个能级,从而造成电荷泄漏。这种电荷泄漏是导致闪存数据保持问题的主要原因之一,因为它可以改变存储在闪存单元中的电荷量,进而改变其阈值电压水平,最终可能导致数据错误。在NANDFlash中,电荷被存储在浮置栅极上。

黑猫奥利奥的博客 1097

Linux线程安全

将mutex的值与al中的值进行交换,交换后mutex的值变为了0,后面对该al中的值进行判断,若是1,则该线程申请锁成功,可以进入临界区对临界资源进行访问。解锁的过程也是这样,将内存中的mutex置回1,使得下一个申请锁的线程在执行交换指令后能够得到1,唤醒那些因为申请锁失败而被挂起的线程。1.大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。是可以的,在临界资源对应的临界区中上锁了,临界区还是多行代码,是多行代码就可以被切换。

! 679

linux cma alloc fail 问题分析

摘要:日志显示CMA连续内存分配失败(错误码-ENOMEM),请求128页(512KB)内存时因CMA区域不足或内存碎片导致失败。分析发现系统CMA总内存131072KB,空闲65536KB。解决方案包括:1)手动触发内存碎片整理;2)修改设备树或内核配置增大CMA区域(如从16MB增至20MB)。通过调整CONFIG_CMA_SIZE_MBYTES或设备树中的size参数可解决该问题。

陌上花开缓缓归以的博客 798

第25节:cesium 地形开挖综合实例-地下管网(含源码+视频)

地图开挖综合示例,包括底图切换,绘制开挖区域,移除开挖区域,影藏地图等等。

qq_29384639的博客 1782

Linux——线程安全

线程安全(Thread Safety)是指在多线程环境中,程序的行为和结果是可预测的、一致的,并且不会由于多个线程同时访问和修改共享数据而导致数据损坏或产生不可预料的副作用。使用 strtok 函数来分割 buff。strtok 函数的第一个参数是要分割的字符串,第二个参数是分隔符。strtok 函数会继续从上次停止的地方开始分割字符串,直到没有更多的分隔符。

weixin_75197906的博客 1197

数据科学助力大数据领域的航空安全分析

随着航空业的快速发展,航班数量不断增加,航空安全问题日益受到关注。大数据时代的到来,使得航空领域积累了大量的数据,包括飞行数据、维护数据、气象数据等。本文章的目的在于探讨如何运用数据科学的方法和技术,对这些大数据进行分析,以提高航空安全水平。范围涵盖了从数据收集、预处理到数据分析、模型构建和应用的整个流程。本文将按照以下结构进行组织:首先介绍数据科学和航空安全分析的核心概念以及它们之间的联系;接着阐述核心算法原理和具体操作步骤,并使用Python源代码进行详细说明;

软件工程实践的博客 1292

【Linux】线程安全与线程同步

线程安全和死锁,以及线程同步的理解与示例

s_little_monster的博客 9433

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux 线程安全

例如有两个线程访问一块临界区,一个写入数据,另一个读取数据,但负责写入的线程的竞争力特别强,每次都能竞争到锁,那么该线程就一直在执行写入操作直到临界区被写满,此后该线程就一直在进行申请锁和释放锁。当该线程被唤醒时,会接着执行临界区的代码,此时便要求该线程必须立马获得对应的互斥锁,因此当线程被唤醒时会自动获得对应的互斥锁。,当线程进入临界区时需要先加锁,然后判断内部资源的情况,若不满足执行条件,则需要进行等待,但此时该线程是拿着锁被挂起的,也就意味着这个锁不会被释放,此时就会发生死锁问题。

qq_61500888的博客 1172

深度学习工具包 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")

【Linux系统】线程安全

原因是,STL 的设计初衷是将性能挖掘到极致,而一旦涉及到加锁保证线程安全,会对性能造成巨大的影响。如果需要在多线程环境下使用,往往需要调用者自行保证线程安全。对于 shared_ptr,多个对象需要共用一个引用计数变量,所以会存在线程安全问题。对于 unique_ptr,由于只是在当前代码块范围内生效,因此不涉及线程安全问题。而且对于不同的容器,加锁方式的不同,性能可能也不同(例如hash表的锁表和锁桶)。不要被上面绕口令式的话语唬住,你只要仔细观察,其实对应概念说的都是一回事。

Sakura_ding的博客 1068

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

线程安全计时 linux,Linux:线程安全

什么是线程安全?当我们多线程对临界资源,或者全局变量静态变量,(多线程执行流共享的资源)进行操作时,容易造成的问题。因为在cpu足够的情况下,多个线程的运行也可能是并行的,因此对临界资源的访问,就会造成争抢操作,然而这种争抢操作,会造成数据的二义性问题,因此线程安全,就是讨论如何保证线程对临界资源的安全访问。解决线程安全问题的方法同步与互斥操作,同步就是对临界资源访问的时序可控性,互斥就是对临界资...

weixin_34169503的博客 115

<Linux> 线程安全

线程互斥、可重入线程安全、死锁、同步(条件变量)

prodigy623的博客 1239

【Linux】Linux 线程安全

Linux线程安全,pthread库介绍,互斥量,条件变量,原子互斥量介绍以及使用

m0_69442905的博客 433
上一篇: C++类和对象(1)
下一篇: C++类和对象(2)
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值