DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随笔分类 -  多线程编程

上一页 1 2

摘要:下载源代码七、线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。使用全局变量进行通信由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,我们建议使用volatile 修饰符,它告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。如果线程间所需传递的信息较复杂,我们可以定义一个结构,通过传.. 阅读全文
posted @ 2013-11-21 08:55 DoubleLi 阅读(624) 评论(0) 推荐(0) 编辑

摘要:软件调试是我们软件开发过程中的重要一课。在前面,我们也讨论过程序调试,比如说这里。今天,我们还可以就软件调试多讲一些内容。比如说条件断点,数据断点,多线程断点等等。[cpp]view plaincopy #includeintvalue=0;voidtest(){inttotal;intindex;total=0;for(index=0;index【Advanced】; c)在【Expression】中输入DW(0x0043178),【ok】回车; d)F5继续运行程序,则程序会在value发生改变的时候停住。以局部数据total为例, a)按F10,运行程序,获取value的地址; b)Al 阅读全文
posted @ 2013-10-15 14:59 DoubleLi 阅读(753) 评论(0) 推荐(0) 编辑

摘要:当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力。用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义。现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的。因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的。本实例针对多线程技术在应用中经常遇到的问题,如线程间的通信、同步等,分别进行探讨,并利用多线程技术进行线程之间的通信,实现了数字的简单排序。 一、 实现方法 1、理解线程 要讲解... 阅读全文
posted @ 2013-10-11 00:02 DoubleLi 阅读(573) 评论(0) 推荐(0) 编辑

摘要:相信有过多线程编程经验的朋友,都吃过死锁的苦。除非你不使用多线程,否则死锁的可能性会一直存在。为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2)模块使用锁的差异 (3)版本之间的差异 (4)分支之间的差异 (5)修改代码和重构代码带来的差异 不管什么原因,死锁的危机都是存在的。那么,通常出现的死锁都有哪些呢?我们可以一个一个看过来,(1)忘记释放锁[cpp]view plaincopy voiddata_process(){EnterCriticalSection();if(/*errorhappens*/)return;LeaveCriticalSectio 阅读全文
posted @ 2013-10-10 19:27 DoubleLi 阅读(1788) 评论(0) 推荐(0) 编辑

摘要:一、死锁会在什么情况发生1、假设有如下代码mutex; //代表一个全局互斥对象 void A() {mutex.lock(); //这里操作共享数据 B(); //这里调用B方法 mutex.unlock(); return; } void B() { mutex.lock(); //这里操作共享数据 mutex.unlock(); return; }此时会由于在A、B方法中相互等待unlock而导致死锁。2、假设有如何代码 mutex; //代表一个全局互斥对象 void A() { mutex.lock(); //这里操作共享数据 if(.....) { return;}mutex.un 阅读全文
posted @ 2013-10-08 15:04 DoubleLi 阅读(8408) 评论(0) 推荐(0) 编辑

摘要:多线程编程之三——线程间通讯作者:韩耀旭原文地址:http://www.vckbase.com/document/viewdoc/?id=1707七、线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。使用全局变量进行通信由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,我们建议使用volatile 修饰符,它告诉编译器无. 阅读全文
posted @ 2013-10-05 23:25 DoubleLi 阅读(14373) 评论(0) 推荐(0) 编辑

摘要:此线程池所依赖的线程类,请参看《一个Windows C++的线程类实现》:http://blog.csdn.net/huyiyang2010/archive/2010/08/10/5801597.aspxSystemThreadPool.h[cpp]view plaincopy #define__SYSTEM_THREAD_POOL__#include"Thread.h"#include#includeclassCThreadPoolExecutor{public:CThreadPoolExecutor(void);~CThreadPoolExecutor(void);/* 阅读全文
posted @ 2013-09-18 16:27 DoubleLi 阅读(1054) 评论(0) 推荐(0) 编辑

摘要:Thread.h[cpp]view plaincopy #ifndef__THREAD_H__#define__THREAD_H__#include#include#includeclassRunnable{public:virtual~Runnable(){};virtualvoidRun()=0;};classCThread:publicRunnable{private:explicitCThread(constCThread&rhs);public:CThread();CThread(Runnable*pRunnable);CThread(constchar*ThreadName 阅读全文
posted @ 2013-09-18 16:26 DoubleLi 阅读(7850) 评论(2) 推荐(1) 编辑

摘要:此线程池所依赖的线程类,请参看《一个Windows C++的线程类实现》:http://blog.csdn.net/huyiyang2010/archive/2010/08/10/5801597.aspxThreadPoolExecutor.h[cpp]view plaincopy #ifndef__THREAD_POOL_EXECUTOR__#define__THREAD_POOL_EXECUTOR__#include"Thread.h"#include#include#includeclassCThreadPoolExecutor{public:CThreadPoolE 阅读全文
posted @ 2013-09-18 16:25 DoubleLi 阅读(15161) 评论(2) 推荐(0) 编辑

摘要:本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关。另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整线程池中线程的数量。文章的最后,我们给出一个简单示例程序,通过该示例程序,我们会发现,通过该线程池框架执行多线程任务是多么的简单。为什么需要线程池目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就是是 阅读全文
posted @ 2013-09-18 14:40 DoubleLi 阅读(30034) 评论(6) 推荐(3) 编辑

摘要:C++实现线程池。 欢迎转载,转载请注明原出处:http://blog.csdn.net/ithzhang/article/details/9020283 代码地址:https://github.com/ithzhang/ThreadpoolLib.git本文介绍的线程池采用C++语言,在windows平台下实现。此版本为Version1.0,以后还会推出功能更完备的后续版本。本着技术分享的精神写作本文同时公布源代码。欢迎大家指出该线程池存在的问题并对当前性能进行讨论。 适用场景: 1.需要大量的线程来完成任务,且完成任务的时间比较短。 2.对性能要求苛刻的应用,比如要求服务... 阅读全文
posted @ 2013-09-15 00:02 DoubleLi 阅读(6304) 评论(0) 推荐(0) 编辑

摘要:HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SD BOOL bManualReset, // reset type BOOL bInitialState, // initial state LPCTSTR lpName // object name ); 该函数创建一个Event同步对象,并返回该对象的Handle lpEventAttributes 一般为NULL bManualReset 创建的Event是自动复位还是人工复位 ,如果true,人工复位, 一旦该Event被设置为有信号,则它一... 阅读全文
posted @ 2013-05-07 14:31 DoubleLi 阅读(2483) 评论(0) 推荐(0) 编辑

摘要:线程同步是一个很困扰大家的一个问题,在线程中有时需要必须的同步机制来控制程序的运行,但什么时候需要加同步机制,什么地方又不需要这些没必要的同步机制呢?在不需要同步的地方加上了同步机制只会降低程序的效率,所以不必要的地方就一定不要加上同步的代码。 我们首先要明白,线程在切换之间都做了些什么事情,首先我们要知道,在系统中全局变量是在全局空间分配的,而局部变量是在系统堆栈中分配的,大家注意了,这两点概念很重要的。操作系统会为我们的每一个线程保护寄存器和堆栈现场,也就是说在线程切换的时候操作系统会为我们的线程恢复原来的寄存器和堆栈现场的(懂些汇编可能更容易理解一些)。所以大家一定要明确,虽然多个线程执 阅读全文
posted @ 2013-04-10 00:36 DoubleLi 阅读(2104) 评论(1) 推荐(0) 编辑

摘要:对于多线程编程,很多人概念不清,写代码的时候要么是处处加锁,影响性能不说,还容易莫名其妙的死锁,还有人对多线程敬而远之。所以学习多线程编程最重要的不是学习API,而是理解什么才是多线程安全的代码从例子说起#include<windows.h>#include<process.h>longglobal1=0;volatilelongglobal2=0;classMyClass{public:MyClass():m(0){++m;}intfun(intv){returnm+v;//-----------9}voidset(intv){m=v;//-------------1 阅读全文
posted @ 2013-04-10 00:22 DoubleLi 阅读(2624) 评论(1) 推荐(0) 编辑

上一页 1 2