多线程的思考

2015-05-12  来源:本站原创  分类:软件工程  人气:880 

多线程把握几点:



1. 一个对象or多个对象,做同样的事or不同的事,完成的目标。

举个例子:

服务器:服务器处理,多个用户的web请求。大致要做三件事,首先接收用户请求,建立连接。其次进行处理。最后返回结过给用户。这就可以分成三件事。分别是多个对象,分别干请求、处理、响应。目标:完成用户的请求。

卖票:不同的卖票人员,干着相同的事(卖票),目标:出售更多的票。

线程作为一个入口,许多对象在这个线程里做事。这个线程事是一件大事,但是需要多个对象的动作一起完成。

线程的通讯问题:

一个线程把问题放入数据池里:里面指明哪个线程来处理,指令是什么,传递的数据。那么其他线程可以循环,检索自己是否属于条件,并删除数据。

当一个线程完成了工作,打算让原线程来实用该数据,那么可以采用放入数据池,但是原线程应该是下面两种状态之一:等待,循转。也可以采用去类似“消息”的方式,比如引用了原线程的一个变量,然后用此变量去执行。从机器执行角度来说是,这个其实是转到原线程的一个区域,IP指针被执行这一函数,但是要考虑,如果没有加锁,那么执行过程中,线程可能会被切换,可能IP会“跳跃”到本线程的另一个代码块中执行,那么考虑可能会使数据不一致,该代码块可能需要的数据并不是真是数据,因为原线程引用该变量执行还没有结束。

所以这也解释了,当外部的线程去操作界面时候,要去加锁,即可能执行一半的时候,我去点击某个按钮,那么两者数据不一致,势必会出现问题。

通讯的实例:线程2执行结束后,加锁,去引用线程1的一个变量,设置好数据后,解锁,此时线程将会按照分配的方式去跑。

qt写入锁:写入时,全部加锁,那么只会允许一个进入。

读取时,不会做此操作。

锁分几种:排他锁,此时屏蔽中断,只允许执行自己这个。同一个函数到同一位置,只允许一个。资源锁,实用资源前会检查资源锁是否满足。

大部分是,使用到某一资源的不同线程,用前会加锁,其他没有使用该资源/变量的不会加锁。也是不符合逻辑的。

相关文章
  • "生命游戏"的多线程算法思考 2013-10-07

    Intel正在ISN网站上举办一个多线程编程大赛,值得关注.Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错.题目难度适中,而且具有启发性,对多核编程感兴趣的C/C++程序员应该关注一下.其实参与这样的活动,置身于竞赛气氛当中,无论是否获奖,都可以在短时间内大幅度地提高对多线程编程的理解.这次比赛比较有特色,为期长达几个月之久,而且每个月都有一轮竞赛,每月评选一轮优胜奖,奖品也很诱人,是一颗4核的酷睿2CPU ;-) 本月(2008年1月)的题目是一个

  • 多线程的思考 2015-05-12

    多线程把握几点: 1. 一个对象or多个对象,做同样的事or不同的事,完成的目标. 举个例子: 服务器:服务器处理,多个用户的web请求.大致要做三件事,首先接收用户请求,建立连接.其次进行处理.最后返回结过给用户.这就可以分成三件事.分别是多个对象,分别干请求.处理.响应.目标:完成用户的请求. 卖票:不同的卖票人员,干着相同的事(卖票),目标:出售更多的票. 线程作为一个入口,许多对象在这个线程里做事.这个线程事是一件大事,但是需要多个对象的动作一起完成. 线程的通讯问题: 一个线程把问题放

  • linux多线程编程(五) 2013-10-22

    使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段.堆栈段和数据段,这是一种"昂贵"的多任务工作方式. 线程 线程是计算机中独立运行的最小单位,运行时占用很少的系统资源.可以把线程看成是操作系统分配CPU时间的基本单元.一个进程可以拥有一个至多个线程.它线程在进程内部共享地址空间.打开的文件描述符等资源.同时线程也有其私有的数据信息,包括:

  • 关于大型网站技术演进的思考(十四)--网站静态化处理-前后端分离-上(6) 2014-05-10

    前文讲到了CSI技术,这就说明网站静态化技术的讲述已经推进到了浏览器端了即真正到了web前端的范畴了,而时下web前端技术的前沿之一就是前后端分离技术了,那么在这里网站静态化技术和前后端分离技术产生了交集,所以今天我将讨论下前后端分离技术,前后端分离技术讨论完后,下一篇文章我将会以网站静态化技术的角度回过头来重新审视下前后端分离技术,希望通过这种审视来加深我们对两套技术的理解. 前后端分离技术我个人认为是web前端被专业化以后的必由之路,而nodejs的出现是前后端分离技术的一个强兴的催化剂,原

  • review引发的有关于单例模式的思考 2014-06-03

    一次代码调试中发现一个情况,即我在查看memcached的connection时,发现总是维持在100来个左右,当然这看似没什么问题,因为memcached默认connection有1024个. 一次代码调试中发现一个情况,即我在查看memcached的connection时,发现总是维持在100来个左右,当然这看似没什么问题,因为memcached默认connection有1024个.但是我想的是为什么会有100来个,因为我的memcachedclient的产生采用的是单例模式我定义了一个me

  • linux多线程编程详解教程(线程通过信号量实现通信代码) 2014-06-15

    这篇文章主要介绍了linux多线程编程详解教程,提供线程通过信号量实现通信的代码,大家参考使用吧 线程分类 线程按照其调度者可以分为用户级线程和核心级线程两种. (1)用户级线程 用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持.在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建.调度.撤销等功能,而内核仍然仅对进程进行管理.如果一个进程中的某一个线程调用了一个阻塞的系统调用,那么该进程包括该进程中的其他所有

  • 哲学家就餐问题中的JAVA多线程学习 2014-06-26

    哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题,下面我们就看一下JAVA多线程如何做 问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条.哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭.上述问题会产生死锁的情况,当5个哲学家都拿起自己右手边的筷子,准备拿左手边的筷子时产生死锁现象. 解决办法: 1.添加一个服务生,只有当经过服务生同意之后才能拿筷子,服务生负责避免死锁发生. 2.每个哲学家必须确定自己左右手的筷子都可用的时候,

  • ASP.NET:一段比较经典的多线程学习代码 2014-06-30

    一段比较经典的多线程学习代码. 1.用到了多线程的同步问题. 2.用到了多线程的顺序问题. 如果有兴趣的请仔细阅读下面的代码.注意其中代码段的顺序,思考一下,这些代码的顺序能否互相调换,为什么?这应该对学习很有帮助的.为了演示,让所有的线程都Sleep了一段时间. using System.Net; using System; using System.IO; using System.Text; using System.Threading; using System.Diagnostics;

  • C++开发:为什么多线程读写shared_ptr要加锁的详细介绍 2014-08-09

    本篇文章介绍了,在C++中为什么多线程读写shared_ptr要加锁的详细说明.需要的朋友参考下 我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 shared_ptr 的线程安全"中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档(http://www.boost.org/doc/libs/release/libs/smart

  • C++多线程编程简单实例 2014-11-24

    本文给大家分享的是C++多线程编程简单实例,由于C++本身没有多线程机制,在windows下我们使用调用SDK win32 api来实现,示例都很简单,讲解的也很详细,推荐给大家. C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程的程序,下面就此简单的讲一下: 创建线程的函数 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD SIZE_T dwSt

  • 多线程服务器的常用编程模型 2015-04-10

    本文主要讲我个人在多线程开发方面的一些粗浅经验.总结了一两种常用的线程模型,归纳了进程间通讯与线程同步的最佳实践,以期用简单规范的方式开发多线程程序. 文中的"多线程服务器"是指运行在 Linux 操作系统上的独占式网络应用程序.硬件平台为 Intel x64 系列的多核 CPU,单路或双路 SMP 服务器(每台机器一共拥有四个核或八个核,十几 GB 内存),机器之间用百兆或千兆以太网连接.这大概是目前民用 PC 服务器的主流配置. 本文不涉及 Windows 系统,不涉及人机交互界面

  • 蜘蛛/爬虫程序的多线程控制(C#语言) 2014-01-28

    在<爬虫/蜘蛛程序的制作(C#语言)>一文中,已经介绍了爬虫程序实现的基本方法,可以说,已经实现了爬虫的功能.只是它存在一个效率问题,下载速度可能很慢.这是两方面的原因造成的: 1. 分析和下载不能同步进行.在<爬虫/蜘蛛程序的制作(C#语言)>中已经介绍了爬虫程序的两个步骤:分析和下载.在单线程的程序中,两者是无法同时进行的.也就是说,分析时会造成网络空闲,分析的时间越长,下载的效率越低.反之也是一样,下载时无法同时进行分析,只有停下下载后才能进行下一步的分析.问题浮出水面,我想

  • 关于面向对象的一点思考 2014-03-27

    工作中,其实一直都"亲密接触"着面向对象技术:参与过很多项目,当把一个一个的类加工成真实的软件,好多时候其实也总感觉有那么点不畅然,沉下心来回忆也总能领悟到一些新东西:整理出这篇文章,且算着在摸索中思考和学习面向对象技术的总结. (1).从编码习惯思考面向对象 谈到面向对象技术,很多书籍都以设计的角度来进行分析和解释,但是,个人认为面向对象其实也与代码的编写息息相关,特别是在这个敏捷技术流行的软件开发年代. 比如示例: insertCorporation(Corporation cor

  • 几种多线程3D引擎架构的比较 2014-09-29

    首先我们得明确3D引擎使用多线程的目的所在: 1.在CPU上进行的逻辑计算(比如骨骼动画粒子发射等)不影响渲染速度 2.较差的GPU渲染速度的低下不影响逻辑速度 第一个目标已经很明确了,我来解释下需要达到第二个目标的原因:许多动作游戏的逻辑判定是基于帧的,所以在渲染较慢的情况下,逻辑不能跳帧,而仍然需要严格执行才能保证游戏逻辑的正确性,这就导致了游戏速度的放慢,而实际上个人认为渲染保持15帧以上就已经可以正常进行游戏了. 在较差的GPU上跑<鬼泣4><刺客信条><波斯王子4&

  • 思考的速度 2012-03-09

    组里的科幻迷同事一次吃饭的时候说,人类的思考速度受限于使用的语言,因为语言太低级,所以思考速度很慢. 今天突然觉得这个很有道理. 对于我们来讲,完全可以慢慢积累出属于自己的高级语言,概念名词流,提升思考速度. 对于系统模块来说就是更加的系统化,进而因为层级关系的清晰,可以做到提纲挈领,用很高级的语言思考. 比如说到多线程解决方案就用ring buffer, task based...就可以三两句描述清楚,senior programmer交流的时候也是非常快速的交流清楚系统实现方式,因为说的人和

  • SOA带来的性能思考 2012-03-09

    做性能测试的一个项目,仔细观察了sotown的框架,有了一个思考,soa的性能如何? SOA 的优点 我已经在前面几个关于soa的文章中,其中soa优点也是ibm soa 架构师认证考试中重点提到的SOA的优点. 敏捷性. 组 成 SOA 应用程序的代码是模块化的:换句话说,代码被包含在可重用的块中,可以用这些代码块构建其他应用程序.可以通过抽象进一步提高编程生产力,抽象把技术细节 (比如编程语言.服务器平台和操作系统.应用服务器类型.DBMS.数据库模式等)隐藏在提供服务的程序后面,服务消费程

  • java多线程学习总结之一:基础原理 2012-10-17

    自上次博文以来将近一月没写了,中间又有个国庆,期间在coding上有松懈,惭愧啊.现在师兄师姐们都在忙着找工作,巴神"思考人生"附体,想些有的没的.忽然开学到现在一月过去了,总结这一个月学习时间好少!也该收收心开始学习了.暑假中重新看了thinking in java到并发这章的中间部分,java多线程是个难点,所以打算都做些记录并结合51CTO的一个多线程系列. 一:概念 操作系统中进程由PCB(进程控制块).程序段.数据段组成的进程实体的运行过程(生命周期创建.调度.撤销).为了减

  • 在Mac OSX 下编译 SBCL 1.0.55 多线程版本出错记录+解决 2013-01-18

    在Mac OSX 下编译 SBCL 1.0.55 多线程版本出错记录+解决 首先从这里下载一个最新的 sbcl 1.0.55 的源代码(the source),解压,然后进去执行 sudo sh make.sh --with-sb-thread 结果出现错误,出错信息如下: Air:sbcl-1.0.55 admin$ sudo sh make.sh --with-sb-thread Password: rm -f *~ *.bak *.orig \#*\# .\#* texput.log *.

  • android多线程编程详解,关于Handler ,Looper , Message , Me... 2013-02-07

    本期的多线程主题与Android相关,侧重讲解在Android中如何用好多线程,需要你有Java的多线程基础. 首先我们思考几个问题,在Android应用中为什么要用多线程?为了解决哪些问题?或者为了实现哪些功能?有哪些好处?请先思考一分钟,再继续往下看. 学习而不思考就像吃东西而不嚼,要么无法下咽,要么尝不出味道,同时都会影响消化吸收.控制一下你那脱缰野马一样的好奇心吧,先思考再往下看. ----------------飘过这条分隔线,我们继续------------------ 1. 为什么

  • JAVA多线程,真的提高了效率吗?--转载 2013-04-09

    在面试的时候被问了一个多线程的问题 回来仔细思考了一下,多线程是否真的能提高了效率? 我对多线程的理解就是: 比如挖一个隧道,有2种开工方法 1.只在山的一头挖,直至挖到山的另一头,从而打通隧道,这可以看成是单线程 2.在山的两头挖,同时开工,最后在山的中间接通,从而打通隧道,这感觉肯定比1快了很多,好比多线程 但是2成立的前提是必须有两个工人.而我们的计算机中一般来说只有一个CPU,也就是说只有一个工人. 多线程不过是CPU在不同的时间片之间切换,而表现出齐头并进的样子. 既然挖隧道的人只有一