多线程之同步问题小结

JAVA多线程之并发与同步,Lock与Syncronized 说到线程,就不得不先说线程和进程的关系。进程是系统的执行单位,一般一个应用程序即是一个进程,程序启动时系统默认有一个主线程,即是UI线程,我们知道不能做耗时任务,否则ANR程序无响应。这时需要借助子线程实现,即多线程。由于线程是系统CPU的最小单位,用多线程其实就是为了更好的利用cpu的资源。一、多线程创建方式//线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源xx.start();//启动线程,run函数运行@Override@Override。 阅读详情

线程同步
多个线程需要访问同一个资源时,你应该考虑同步问题;例如:银行系统中,可能使用多个线程对数据

库进行操作,如:存储、更新、查询线程同时访问数据库,极可能出现:查询到的数据是未完全更新的

数据。还有就是火车售票系统,多窗口售票可以认为是多个线程,多窗口共享总票资源(tickets),此时

如果不对共享资源进行同步处理,就会出现:卖第0张票的情况!
long tickets = 100;  //一共100张票

unsigned _stdcall ThreadProc1(void * pArgu = NULL)
{
 while(TRUE)
 {
  if(tickets>0)
  {
   FILE * fp = fopen("c://ticketseller.txt", "a");
   fprintf(fp, "A窗口出票:%d/n", tickets--);
   fclose(fp);
  }
  else
  {
   FILE * fp = fopen("c://ticketseller.txt", "a");
   fprintf(fp, "A窗口票卖完了:%d/n", tickets);
   fclose(fp);
   break;
  }
 }
 return 0;
}


unsigned _stdcall ThreadProc2(void * pArgu = NULL)
{
 while(TRUE)
 {
  if(tickets>0)
  { 
   Sleep(1); //B售票员打个顿,停了1毫秒(0.001秒)
   FILE * fp = fopen("c://ticketseller.txt", "a");
   fprintf(fp, "B窗口出票:%d/n", tickets--);
   fclose(fp);
  }
  else
  {
   FILE * fp = fopen("c://ticketseller.txt", "a");
   fprintf(fp, "B窗口票卖完了:%d/n", tickets);
   fclose(fp);
   break;
  }
 }
 return 0;
}

 

#include "process.h"
void CMy1006Dlg::OnOK()
{
 unsigned nThreadID = 0;
 FILE * fp = fopen("c://ticketseller.txt", "w");
 fprintf(fp, "开始测试多线程卖票:%d/n", tickets);
 fclose(fp);

 _beginthreadex(NULL,
  0,
  ThreadProc1,
  NULL,
  0,
  &nThreadID);
 _beginthreadex(NULL,
  0,
  ThreadProc2,
  NULL,
  0,
  &nThreadID);
}

//上述代码,你可能会看到下面你不愿意看到的结果:
开始测试多线程卖票:100
A窗口出票:100
A窗口出票:99
B窗口出票:98
A窗口出票:97
A窗口出票:96
A窗口出票:95
A窗口出票:94
A窗口出票:93
B窗口出票:92
A窗口出票:91
A窗口出票:90
A窗口出票:89
A窗口出票:88
A窗口出票:87
B窗口出票:86
A窗口出票:85
A窗口出票:84
B窗口出票:83
A窗口出票:82
A窗口出票:81
A窗口出票:80
A窗口出票:79
A窗口出票:78
A窗口出票:77
B窗口出票:76
A窗口出票:75
A窗口出票:74
A窗口出票:73
A窗口出票:72
A窗口出票:71
B窗口出票:70
A窗口出票:69
A窗口出票:68
A窗口出票:67
A窗口出票:66
A窗口出票:65
A窗口出票:64
B窗口出票:63
A窗口出票:62
A窗口出票:61
A窗口出票:60
B窗口出票:59
A窗口出票:58
A窗口出票:57
A窗口出票:56
A窗口出票:55
A窗口出票:54
A窗口出票:53
B窗口出票:52
A窗口出票:51
A窗口出票:50
A窗口出票:49
A窗口出票:48
A窗口出票:47
B窗口出票:46
A窗口出票:45
A窗口出票:44
A窗口出票:43
A窗口出票:42
A窗口出票:41
B窗口出票:40
A窗口出票:39
A窗口出票:38
B窗口出票:37
A窗口出票:35
A窗口出票:34
A窗口出票:33
A窗口出票:32
A窗口出票:31
B窗口出票:30
A窗口出票:29
A窗口出票:28
A窗口出票:27
A窗口出票:26
A窗口出票:25
B窗口出票:24
A窗口出票:23
A窗口出票:22
A窗口出票:21
A窗口出票:20
A窗口出票:19
A窗口出票:18
B窗口出票:17
A窗口出票:16
A窗口出票:15
A窗口出票:14
A窗口出票:13
B窗口出票:12
A窗口出票:11
A窗口出票:10
A窗口出票:9
A窗口出票:8
A窗口出票:7
A窗口出票:5
A窗口出票:4
A窗口出票:3
A窗口出票:2
A窗口出票:1
A窗口票卖完了:0
B窗口出票:0
B窗口票卖完了:-1

 

解决办法很多,在Windows平台下MFC为我们封装了同步管理类:CSyncObject,我们经常看到的CEvent(

事件)、CCriticalSection(临界区)、CMutex(互斥体)、CSemaphore(信号量)都是它的派生类; 使用它们

解决同步问题就方便多了!它们的头文件都是:#include "afxmt.h"

 

一、事件(CEvent)
常用于不同线程之间在满足特定条件情况下的唤醒操作;它有两种状态,有信号和无信号状态;例如:

在一些串口通信程序中,一个线程负责监听串口状态,一个线程负责数据的界面回显;那么就可以在侦

听到串口状态发生变化之后,用信号的形式通知界面回显线程;

我经常这么干:
CEvent hUIEvent = CreateEvent(NULL, FALSE, TRUE, NULL );
//创建一个使用默认安全属性、初始无信号、手动状态、无名称的事件对象(界面线程触发事件)
侦听到串口状态发生变化时:
//...数据处理
SetEvent(hUIEvent);  //通知界面回显线程,设置事件为有信号状态;ResetEvent(hUIEvent); 设置为

无信号状态

//界面回显线程
unsigned _stdcall UIThreadProc(void * pArgus =  NULL)
{
DWORD dwWait = WaitForSingleObject(hUIEvent, 3000); //3秒检测一次事件状态
switch(dwWait)
{
 case WAIT_OBJECT_0:
 //界面数据显示
 break;
 case WAIT_TIMEOUT:
 break;
 case WAIT_FAILED:
 break;
 default:
 break;
}
return 0;
}

 

二、临界区(CCriticalSection,其构造函数没有参数)
    当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有

临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将全

部被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程

访问共享资源。

CCriticalSection criticalSection;
criticalSection.Lock();
//...被保护的代码段
criticalSetion.Unlock();

注意:上面提到的火车售票问题,由于tickets不是独占性资源,就不要使用临界区对象;一旦一个售票

窗口得到临界资源,他不卖票反而吃饭去了,其他窗口则有票不能卖!一定要注意了,是独占性资源可以

使用临界区对象,这个资源我使用了,别人都别想用;

 

三、互斥体(CMutex)
和临界区类似,不同的是:互斥体可应用于不同进程之间;如,我们常使用互斥体对象实现应用程序的

唯一实例限制(不同进程之间):
首先在App类中定义互斥体对象  HANDLE hMutex;
在App::InitInstance的适当位置,添加如下代码:
 hMutex =  CreateMutex(NULL, TRUE, "CUSTOM_MUTEX_NAME");
 if( hMutex != NULL )
 {
  if( GetLastError() == ERROR_ALREADY_EXISTS )
  {
   exit(0);
  }
 }
但好像一些较复杂的应用程序,可能也会不尽人意,具体什么情况忘记了,以后想起来了再补充;但我

想这种方法已经不错了!

 

关于临界区和互斥体说一个简单的例子:
大家都做过火车,火车厕所的使用相当于一个临界区资源,具有独占性,当一个人进去开始使用资源之前,他首先要将厕所的门锁上,使用完资源后,再将锁打开;特别是春运或5.1/10.1放假时,坐硬座的乘客应该深有体会!别人加锁之后,你只有等待!

 

四、信号量
常用于对访问某一共享资源线程数目的限制;常用到的Win32函数有:
CreateSemaphore(NULL, 10, 10, NULL);
//创建一个使用默认安全属性、初始线程计数是10、线程总数为10、无名称的信号量对象

多线程顺序打印的5种解法 多线程同步的方式有许多,有传统的synchronized锁,还可以使用lock锁,下面列举多线程顺序打印的5种解法,算作对线程同步的一个总结。 文章目录经典面试题 经典面试题 1.三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC…”的字符串 2.两个线程交替打印 0~100 的奇偶数 3.通过 N 个线程顺序循环打印从 0 至 100 4.多线程按顺序调用,A->B->C,AA 打印 5 次,BB 打印10 次,CC 打印 15. 阅读详情

相关推荐

多线程同步

多线程性能一直是困扰我们代码性能的一个难点,代码中给出了一种方式,去同步字符串,线程携带同一个字符串进入同步方法中,会阻塞,非同一个字符串不会阻塞,所以我们可以考虑用账户名称、或一些账户独有不会重复的属性来进行代码块同步,这样可最大程度的提高同步的性能,不用再考虑锁表等操作(当然若为了双层保险,也可以这么做,看业务的安全要求),也无需为了锁定账户而将所有的账户缓存之内存中,总之,如上方法可最大程序的提高多线程的性能,且安全有效

fclose函数无响应

现象:win32程序在退出时无响应,当一步步跟踪代码时走到fclose。 原因:打开文件在一个线程中,写文件时在另一个线程,在open和write文件时均正常,只有在fclose时出现无响应。 解决:将打开文件、写数据到文件,关闭文件等操作放在同一个线程中完成。 转载于:https://www.cnblogs.com/SunShineYPH/p/4387199.html...

weixin_30596165的博客 306

基于ENVI5.3的Landsat条带去除、辐射定标、大气校正

基于ENVI5.3的Landsat条带去除、辐射定标、大气校正坏带修复辐射定标大气校正 坏带修复 1.下载landsat_gapfill插件,放入“安装目录\Exelis\ENVI53\extensions”,重启ENVI 2. 加载拟处理文件(MTL.txt格式) 3.打开landsat_gapfill 4.选择存放位置并命名文件 5.选择处理文件 辐射定标 1.选择工具Radiometric Calibration 2.选择已修复坏带文件 3.修改参数,选择输出位置及命名文件 大气校正 1

u010198950的博客 1万+

C语言涉及文件的函数执行慢,c语言分别用库函数和系统函数来进行文件操作效率对比...

使用库函数来进行文件读取#include #include int main(void){FILE *fp, *fp_out;int n;fp = fopen("dict.txt", "r");if (fp==NULL){perror(fopen error);exit(1);}fp_out = fopen("dict.cp", "w");if (fp_out ==NULL){perror("fo...

weixin_39895881的博客 783

从Jira到Notion:用Sequential Thinking重构你的敏捷工作流(含GPT-6配置模板)

本文探讨了如何利用Sequential Thinking这一AI认知模型,重构敏捷开发工作流。通过连接Jira、Notion等工具,构建动态依赖图谱,实现从被动响应到主动规划的转变。文章提供了详细的配置教程和GPT-6配置模板,帮助团队实现任务自动拆解、智能看板生成与跨平台协调,从而提升项目管理效率。

gpt4scribbler的博客 205

UM982上位机调试【精简版】

分享一些关于UM982卫导模块上位机调试的简快捷单小功能。

在线求职中... 1万+

java 多线程 选择题_Java多线程题库

一、填空题处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入____阻塞_____状态。处于新建状态的线程被启动后,将进入线程队列排队等待CPU,此时它已具备了运行条件,一旦轮到享用CPU资源就可以获得执行机会。上述线程是处于就绪状态。解析: 线程的生命周期—五个阶段新建状态---- new关键字创建线程对象就绪状态---...

weixin_36227100的博客 3744

GD32F303开发实战(一):从零搭建MDK工程与时钟配置详解

本文详细介绍了如何从零开始为GD32F303微控制器搭建一个清晰、可维护的MDK工程模板。内容涵盖开发环境准备、工程目录结构规划、文件分组管理、关键工程配置,并重点解析了时钟树原理,手把手指导配置108MHz系统时钟。通过实战步骤与常见问题排查,帮助开发者构建一个稳定可靠的开发基础,便于后续功能扩展。

weixin_29174141的博客 270

多线程作业及答案

多线程作业 一、填空题 1.处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入_________状态。 2.处于新建状态的线程被启动后,将进入线程队列排队等待CPU,此时它已具备了运行条件,一旦轮到享用CPU资源就可以获得执行机会。上述线程是处于 状态。 3.一个正在执行的线程可能被人为地中断,让...

qq_42591018的博客 6035

服务器AutoDL自己部署QWen3

说明:核心参数:30B 模型原精度权重文件约 60GB,单张 PRO 6000 拥有 48GB 显存,单卡塞不下原精度模型,2张 PRO 6000 = 96GB 总显存,这不仅能装下模型,还能留出约 30GB 显存给 KV Cache(上下文长度) 以及 Omni 多模态组件 处理图片/视频输入时的额外开销。1. 前提准备模型选择:直接下载到 AutoDL 服务器上=》原精度模型(BF16/FP16) 的 Qwen3-Omni-30B,选择的示例和环境如下。# 3. 正式执行模型下载。

xiaoxiao_00001的博客 414

F5高可用HA配置详情

F5 HA详细配置

weixin_45843944的博客 3023

多线程的同步问题小结

多线程同步一般可以使用: 1.临界区(CRITICAL_SECTION):    临界区并不是内核对象,它存放在进程内部,所以不能跨进程。不用create和closehandle,直接init和delete就可以    它是轻量级的,效率可能是其他内核对象100倍    但是一个线程意外结束,未调用leave时,回导致其他线程一直不能访问被锁定资源    同一个线程在leave之前,可以

neilhuang的专栏 516

精度0.01%决定续航多20km|新能源汽车研发测试:功率分析仪到底有多硬核?

新能源汽车测试、功率分析仪、电驱系统、效率MAP、谐波THD、GB/T18488、CLTC工况、三电测试、台架标定、能量流分析。中的核心作用,用公式、思维导图、实战金句与避坑指南,帮研发测试人员把准数据、提效率、降返工,看完就能落地用。点击关注,进公众号主页查看历史文章,**台架接线图、效率MAP模板、GB/T18488测试清单等。优化弱磁/调制策略,高效区占比提升5%,CLTC续航直接+8~20km。同样工况,两次数据差0.8%,报告根本没法交。结果:数据飘、定位慢、反复返工、认证不过。

优快云-新能源汽车研发测试专业博主 169

02_集合线程安全和多线程锁

集合线程安全和多线程锁

w7635122886的博客 250

数据分析案例-2024年裁员数据集可视化分析

本实验数据集来源于Kaggle,原始数据集为2020-2024年裁员数据,共有3577条,12个变量,该数据集提供了不同公司的裁员信息。它包括以下几栏:Company:裁员发生的公司名称。Location_HQ:公司总部位置。Industry:公司所属的行业或部门。Laid_Off_Count:公司解雇的员工数量。Percentage:公司员工被解雇的百分比。Date:裁员发生的日期。Source:信息来源网址。Funds_Raised:公司募集资金的信息。

m0_64336780的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java 重排序_Java并发编程之指令重排序

指令重排序如果说内存可见性问题已经让你抓狂了,那么下边的这个指令重排序的事儿估计就要骂娘了~这事儿还得从一段代码说起:public class Reordering {private static boolean flag;private static int num;public static void main(String[] args) {Thread t1 = new Thread(ne...

weixin_33914982的博客 545

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

多线程小结(三)线程同步总结

对线程同步做一个总结, 一般来说,线程同步比较让人纠结的地方在于它是许多线程共用一段代码的,而且什么时候谁用谁不用,也基本是不可控制不可预料的,那么对于它们可能会同时访问并更改的数据,就需要加锁了。加锁就是将一段代码变为临界区 —— 一段在同一时候只被一个线程进入/执行的代码,加锁的方式一般有两种,Lock关键字 C#提供lock关键字实现临界区,MSDN里给出的用法: Object t...

weixin_30527143的博客 112

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深度学习工具包 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多线程编程小结

 Linux多线程编程小结       前一段时间因为开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,很烦躁的说,现在抽个时间把之前所学的做个小节。文章内容主要总结于《Linux程序设计第3版》。1.Linux进程与线程       Linux进程创建一个新线程时,线程将拥有自己的栈(因为线程有自己的局部变量),但与它的创建者共享全局变量、文件描述符、信号句柄

愤怒的小狐狸----博客专栏 6万+

线程同步小结

[align=center][size=large][b]Java中的线程同步小结[/b][/size][/align] 最近听了大家讲一些线程同步的知识,个人感觉只学到了一些皮毛,以前也写过有关线程的小程序,但没想这么多,像神马线程同步问题的。。。在这里就跟大家来分享一下我这两天学到的一点东西吧。个人很菜。还望各位大神路过飘过的多多指教昂。。。 [size=medium][b]什么是线程...

u012701265的博客 151

c++多线程 thread mutex 使用小结

c++多线程 thread mutex 使用小结std::thread std::mutex 基本使用方法std::thread 用于开启一个线程。std::mutex 是互斥锁,防止不同线程间的代码在不同线程间做不安全的切换std::mutex try_lock()子线程作生产者、主线程做消费者子线程做加载、主线程显示百分比多线程里遇到的几个问题: c++对于多线程的支持,依赖于 std::th...

杂七杂八 9880

Java多线程自我小结

Java多线程自我小结一、多线程的相关概念1. 进程2. 线程3.线程调度(1)分时调度(2)抢占式调度4. 同步与异步5. 并发与并行二、多线程的三种启动方式1. 直接通过继承Thread启动2. 通过实现Runnable接口给线程分配任务启动3. 通过实现带返回值的Callable接口给线程分配任务启动 一、多线程的相关概念 1. 进程 指一个内存中运行的应用程序,每个进程都有一个独立的内存空间 2. 线程 是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有

橙小狮的博客菜园子 987

Java小结4——多线程

Java笔记4——多线程相关内容,主要是学习《黑马》的视频笔记

weixin_43240212的博客 782

【python】多线程小结

every blog every motto: Light tomorrow with today. 0. 前言 前不久有一个任务用到了多线程,也简单的学习了下,但是没有做相关记录,今天有空再复习一遍,并简单记录下来。 装饰器也一并简单介绍下。 说明: 后续可能会增补 1. 正文 1.1 ...

胡侃有料的博客 690

四种线程同步(或互斥)方式小结

一,什么是线程同步和互斥 同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。这里的同步千万不要理解成那个同时进行,应是指协同、协助、互相配合。线程同步是指多线程通过特定的设置(如互斥量,事件对象,临界区)来控制线程之间的执行顺序(即所谓的同步)也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步,那线程之间是各自运行各自的! 线程互斥是指对于共享的进程系统资源,在各单个线...

Dashi_Lu的博客 3140

Linux下多线程编程小结

只要是进行Linux应用开发,多线程编程肯定是绕不开的,而线程和进程是两种有千丝万缕关系的模型,本文先不去讲太书面化的定义,先从一个入门+使用的角度来分析多线程。 先说几个总结性的关键句: 1、进程是资源分配的最小单位,线程是CPU调度的最小单位 这句话的意思,关键是最后一句,线程是CPU调度的最小单位,也就是说,本质上操作系统调度的是线程 而不是进程,因为任何一个进程都包...

猪哥的专栏 1726

windows同步对象小结

windows同步对象小结        在windows平台下,用于对多线程(包括进程)之间的同步保护机制,基本上有这么几种: 1)Critical Section对象 2)Event对象 3)Mutex对象 4) Semaphore对象。网上已经有很多的文章在介绍这些对象是怎么使用的。本文的着眼点在于:总结出这些同步保护机制的一些明显的行为特征,而这些行为特征,也是我们再写程序时经常会

jfkidear的专栏 741
上一篇: GetMessage和PeekMessage的应用心得
下一篇: Win32多线程之概述
PerfectToday
博客等级 码龄18年 46粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值