Win32 多线程学习笔记
学到的API函数
一、线程
创建线程、结束线程、获取线程的结束码
CreateThread
ExitThread
GetExitCodeThread
二、线程结束时触发
创建线程之后,等待线程的结束之后,再继续执行
WaitForSingleObject
创建多个线程之后,等待一组线程(或其中的一个)结束,再继续执行
WaitForMultipleObjects
将消息循环与内核对象的等待合并
MsgWaitForMultipleObjects
三、同步
SendMessage 是同步的
PostMessage 是异步的
1、临界区
初始化和销毁临界区的变量
InitializeCriticalSection
DeleteCriticalSection,不同于delete操作的释放内存
2、进入和离开临界区
临界区变量初始化之后,可以进入,然后可以离开
EnterCriticalSection
LeaveCriticalSection
一旦调用EnterCriticalSection进入某变量的临界区之后,仍然可以再次调用EnterCriticalSection进入该变量的临界区。但进入多少次,也要Leave多少次,该临界区才能被销毁。
临界区中不要调用Sleep或Wait...函数
临界区的不足:如果进入了临界区的线程结束了,而没有调用离开临界区的函数,该临界区将无法被销毁掉;而系统或其他线程是无法知道进入临界区的线程是否已经结束
避免这个不足,需要使用mutex
3、死锁
当有一段代码需要2个或更多资源(也就是至少进入两次临界区)时,可能会发生死锁
"all-or-nothing"(要不统统获得,要不统统没有),可以阻止死锁的发生
4、Mutex
Mutex的使用过程:
CreateMutex(创建Mutex时如果指定名称,则可以在进程间使用同一个Mutex。由于该名称整个操作系统都可以访问,所以需要避免重名)
OpenMutex
WaitForSingleObject 或 WaitForMultiObjects 或 MsgWaitForMultiObjects
ReleaseMutex
CloseHandle
5、信号量
等待一个数量为n的资源,当n=0时,就必须等待;使用,使n-1;释放,使n+1。如果n=1,就是Mutex。
CreateSemaphore 创建信号量(可以包含名称参数)
然后利用Wait...()函数可以锁定一个Semaphore
ReleaseSemaphore
请记住, lpPreviousCount 参数所传回来的是一个瞬间值。你不可以把lReleaseCount 加上 *lpPreviousCount,就当作是 semaphore 的现值,因为其他线程可能已经改变了 semaphore 的值。
6、事件
CreateEvent 创建事件
SetEvent 设置事件为激发状态
ResetEvent 设置事件为非激发状态(注意:不是重新设置为激发状态)
PulseEvent 如果是手动的ResetEvent,设置为激发状态后,则唤醒所有等待中的线程,然后变为非激发状态;如果是自动档ResetEvent,设置为激发状态后,则一个一个地唤醒等待中的线程
弊端:
1)激发event时没有线程在等待,则该event会被遗失
2)容易造成死锁
7、InterLocked变量
对于简单变量的互斥操作(比如计数器),如果用临界区或Mutex,相对来说会比较占用资源(相对计算器加1的操作而言),于是InterLocked变量出现了
InterlockedIncrement 值加1
InterlockedDecrement 值减1
InterlockedExchange 传入新值,返回旧值
四、线程控制
1、结束线程
TerminateThread 结束线程
缺点:
1)未给被结束线程一个清理自己内存的机会,或者被结束
2)导致内存泄漏
3)线程正进入临界区,则该临界区将永远处于锁定状态
2、线程优先权
Win32 多线程学习笔记的更多相关文章
- win32多线程学习笔记
<多核程序设计技术> 第五章--线程api,一个使用windows事件的线程应用程序,vs2008下编译调试通过. // 线程通信机制.cpp : 定义控制台应用程序的入口点. // #i ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- java进阶-多线程学习笔记
多线程学习笔记 1.什么是线程 操作系统中 打开一个程序就是一个进程 一个进程可以创建多个线程 现在系统中 系统调度的最小单元是线程 2.多线程有什么用? 发挥多核CPU的优势 如果使用多线程 将计算 ...
- Java多线程学习笔记(一)——多线程实现和安全问题
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...
- java 多线程学习笔记
这篇文章主要是个人的学习笔记,是以例子来驱动的,加深自己对多线程的理解. 一:实现多线程的两种方法 1.继承Thread class MyThread1 extends Thread{ public ...
- Java多线程学习笔记--生产消费者模式
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
随机推荐
- IMoniker接口的MKParseDisplayName和 GetDisplayName的注意事项
IMoniker接口的MKParseDisplayName和 GetDisplayName的注意事项
- Mycat配置文件schema.xml参数配置
Mycat原理: Mycat的原理中最重要的一个动词是"拦截",它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析.路由分析.读写分离分析.缓存分析等 ...
- C++ JsonCpp 使用(含源码下载)
C++ JsonCpp 使用(含源码下载) 前言 JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择JSON的全称为:JavaScri ...
- CSS布局--浮动与清除
浮动和清除 浮动和清除是页面布局的重要属性.浮动的意思是指将元素从常规的文档流中取出来. 当你浮动一个元素的时候,浮动的元素会被浏览器尽量的往上放,能放多高就放多高,一直到某个元素的边界为止. 浮动元 ...
- 亚马逊开放机器学习系统源代码:挑战谷歌TensorFlow
北京时间5月17日上午消息,亚马逊在开源技术领域迈出了更大的步伐,宣布开放该公司的机器学习软件DSSTNE的源代码.这个最新项目将与谷歌的TensorFlow竞争,后者已于去年开源.亚马逊表示,在缺乏 ...
- centos 下添加epel源
来源于http://www.centoscn.com/CentOS/config/2014/0920/3793.html,收录备用 0.安装yum优先级插件 yum install yum-prior ...
- Eclipse 3.5使用dropins的插件安装方式
以前安装Eclipse插件有两种方式 1 直接copy插件到features/plugins目录 2 在links目录下创建链接文件. 而 Eclipse 3.5又推出另一种新的安装途径, 更加灵活. ...
- ObjC.class-cluster
class cluster In a class cluster, only an abstract superclass is public. Allocating an instance actu ...
- FreeBSD_11-系统管理——{Part_6 - SYSCTL}
sysctl 常见参数 Name Type Changeable 示例 & 示意 kern.ostype string no FreeBSD kern.osrelease string no ...
- vim基础使用
vim的常用模式有分为命令模式,插入模式,可视模式,正常模式.本教程中,只需要用到正常模式和插入模式.二者间的切换即可以帮助你完成本指南的学习. 进入方法: vim xxx.xml 正常模式 正常模式 ...