Windows多线程
文章平均质量分 72
ILoveThisSite
这个作者很懒,什么都没留下…
展开
-
CreateThread与_beginthreadex本质区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别,在实际的编程中到底应该使用CreateThread还是_beginthreadex? 使用多线程其实是非常容易的,下面这个程序的主线程会创建了转载 2013-01-15 14:09:40 · 500 阅读 · 0 评论 -
关键段,事件,互斥量,信号量的“遗弃”问题
一.什么是“遗弃”问题 在《秒杀多线程第七篇 经典线程同步 互斥量Mutex》讲到了互斥量能处理“遗弃”问题,下面引用原文: 互斥量常用于多进程之间的线程互斥,所以它比关键段还多一个很有用的特性——“遗弃”情况的处理。比如有一个占用互斥量的线程在调用ReleaseMutex()触发互斥量前就意外终止了(相当于该互斥量被“遗弃”了),那么所有等待这个互斥量的线程是否会由于该互斥量无法被触转载 2013-01-16 10:49:56 · 569 阅读 · 0 评论 -
读者写者问题
与上一篇生产者消费者问题一样,读者写者也是一个非常著名的同步问题。读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件。 上面是读者写者问题示意图,类似于生产者消费者问题的分析过程,首先来找找哪些是属于“等待”情况。 第一.写者要等到没有读者时才能去写文件。 第二.所有读者要等待转载 2013-01-16 10:45:48 · 1213 阅读 · 0 评论 -
生产者消费者问题
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。转载 2013-01-16 10:44:20 · 865 阅读 · 0 评论 -
信号量Semaphore
首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便。下面是这几个函数的原型和使用说明。 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialC转载 2013-01-16 10:33:56 · 728 阅读 · 0 评论 -
事件Event
本篇介绍用事件Event来尝试解决这个线程同步问题。 首先介绍下如何使用事件。事件Event实际上是个内核对象,它的使用非常方便。下面列出一些常用的函数。 第一个 CreateEvent 函数功能:创建事件 函数原型: HANDLECreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes, BOO转载 2013-01-15 15:22:12 · 541 阅读 · 0 评论 -
互斥量Mutex
互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源。使用互斥量Mutex主要将用到四个函数。下面是这些函数的原型和使用说明。 第一个 CreateMutex 函数功能:创建互斥量(注意与事件Event的创建函数对比) 函数原型: HANDLECreateMutex( LPSEC转载 2013-01-15 15:28:47 · 658 阅读 · 0 评论 -
经典线程同步总结 关键段 事件 互斥量 信号量
首先来看下关于线程同步互斥的概念性的知识,相信大家通过前面的文章,已经对线程同步互斥有一定的认识了,也能模糊的说出线程同步互斥的各种概念性知识,下面再列出从《计算机操作系统》一书中选取的一些关于线程同步互斥的描述。相信先有个初步而模糊的印象再看下权威的定义,应该会记忆的特别深刻。 1.线程(进程)同步的主要任务 答:在引入多线程后,由于线程执行的异步性,会给系统造成混乱,特别转载 2013-01-16 10:32:04 · 687 阅读 · 0 评论 -
多线程同步内功心法——PV操作上
为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点。本文将会先简要介绍下PV操作的来源和基本使用方法,然后再通过两道经典的计算机考研真题——放水果和安全岛来示范如何运用PV操作。 先讲讲PV操作的起源和用法。 1962年,荷兰学者Dijksrta在参与X8计算机的开发中设计并实现了具有多道程序运行能力的操作系统——转载 2013-01-16 10:30:23 · 746 阅读 · 0 评论 -
读写锁SRWLock
本篇将介绍一种新方法——读写锁SRWLock来解决这一问题。读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待。因此用读写锁来解决读者写者问题会使代码非常清晰和简洁。 下面就来看看如何使用读写锁,要注意编译转载 2013-01-16 10:29:02 · 839 阅读 · 0 评论 -
关键段CS总结
1.关键段共初始化化、销毁、进入和离开关键区域四个函数。 初始化:void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection); 销毁:void DeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection); 进入关键区域:void Enter原创 2013-01-15 14:38:26 · 747 阅读 · 0 评论 -
原子操作 Interlocked系列函数
在多线程中,经常有进行加减操作的情况,“+”、“-”等均不是院子操作,如直接使用则可能会导致一些意外的结果。本文介绍了Interlocked院子操作系列函数,非常方便。 为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是否运行出错。这也非常类似于统计一个网站每天有多少用户登录,每个用户登录用一个线程模拟,线程运行时会将一个表示计数的变量递增。程序在最后输出计数的值表示有今天转载 2013-01-15 14:15:59 · 634 阅读 · 0 评论 -
VC++中进程间相互通信的十一种方法
进程通常被定义为一个正在运行的程序的实例,它由两个部分组成: 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方 另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于其它进程的转载 2013-04-17 10:38:51 · 595 阅读 · 0 评论