多线程笔记2

第三章:快跑与等待

1.绝对不要在win32中使用busy loop。

2.等待一个线程的结束:

DWORD WaitForSingleObject(
HANDLE hHandle,                   //等待对象的handle
DWORD dwMilliseconds            //等待时间,时间终了,即使handle尚未激发,此函数还是要返回。0立刻返回,INFINITE无穷等待

);

  函数失败:返回WAIT_FAILED

  函数成功:

  (1)等待的目标核心对象变成激发状态,返回值为WAIT_OBJECT_0

  (2)核心对象激发之前,等待时间终了,返回值为WAIT_TIMEOUT

  (3)如果一个拥有mutex的线程结束前没有释放mutex,则传回WAIT_ABANDONED

3.核心对象激发的意义

(1)Thread :线程运行时处于未激发状态,线程结束对象被激发。对象由CreateThread或CreateRemoteThread产生。

(2)Process:进程运行时处于未激发状态,进程结束对象被激发。对象由CreateProcess或OpenProcess产生。

(3)Change Notification:当一个特定的磁盘子目录发生变化时,此对象即被激发。此对象由FindFirstChangeNotification产生。

(4)Console Input:当console窗口输入缓冲区中有数据可用时,此对象处于激发状态。CreateFile、GetStdFile产生console handle。

(5)Event:对象的状态受控于3个win32函数:SetEvent,PulseEvent,ResetEvent。CreateEvent、OpenEvent可以传回一个Eventobject handle。Event对象的状态也可以被操作系统设定---如果使用与overlapped操作时。

(6)Mutex:如果Mutex没有被任何线程拥有,就是处于激发状态。一旦一个等待mutex的函数返回了,mutex自动重置为未激发状态。CreateMutex、OpenMutex可以获得一个mutex handle。

(7)Semaphore:有个计数器,约束拥有者个数。计数器大于0,semaphore处于激发状态;等于0,处于未激发状态。CreateSemaphore,OpenSemaphore可以传回一个semaphore handle。

  补充说明(3):这些变化指的是:      

FILE_NOTIFY_CHANGE_FILE_NAME       产生、删除、重新命名一个文件
FILE_NOTIFY_CHANGE_DIR_NAME        产生或删除一个子目录
FILE_NOTIFY_CHANGE_ATTRIBUTES     目录及子目录中的任何属性改变
FILE_NOTIFY_CHANGE_SIZE                 目录及子目录中的任何文件大小的改变
FILE_NOTIFY_CHANGE_LAST_WRITE     目录及子目录中的任何文件的最后写入时间的改变
FILE_NOTIFY_CHANGE_SECURITY         目录及子目录中的任何安全属性改变

4.等待多个对象

DWORD WaitForMultipleObjects(
DWORD nCount,                                     //表示lpHandles所指之handles数组的元素个数。最大容量是MAXIMUM_WAIT_OBJECTS
CONST HANDLE *lpHandles,                    //指向一个由对象handles所组成的数据,这些handles不需要为相同的类型。
BOOL bWaitAll,               //True表示所有的handles都必须激发,函数才返回。否则此函数将在任何一个handle激发返回。
DWORD dwMilliseconds           //等待时间
);

返回值:

(1)如果因时间终了返回,返回值为WAIT_TIMEOUT

(2)如果bWaitAll为True,返回值为WAIT_OBJECT_0

(3)如果bWaitAll为False,则将返回值减去WAIT_OBJECT_0,就表示数组中的哪个handle被激发了

(4)如果等待的对象中有任何的Mutex,返回值可能从WAIT_ABANDONED_0 到 WAIT_ABANDONED_0 + nCount - 1.

(5)如果函数失败,传回WAIT_FAILED.

5.MsgWaitForMultipleObjects:  “对象被激发” 或 “消息到达队列” 时被唤醒而返回

DWORD MsgWaitForMultipleObjects(
DWORD nCount,
LPHANDLE pHandles,
BOOL fWaitAll,
DWORD dwMilliseconds,
DWORD dwWakeMask               //欲观察的用户输入消息
);

输入消息:

QS_ALLINPUT
QS_HOTKEY
QS_INPUT
QS_KEY
QS_MOUSE
QS_MOUSEBUTTON
QS_MOUSEMOVE

QS_PAINT
QS_POSTMESSAGE
QS_SENDMESSAGE
QS_TIMER

时间: 2024-10-08 10:44:37

多线程笔记2的相关文章

多线程笔记

1.多线程的创建方式有两种 a 实现Runnable的接口 实现他的run的方法 建议使用这种 因为接口可以实现多继承 b 集成Thread 的抽象类,重写父类的 run的方法. 2.run() 与start()的区别 调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行. 把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的.并且run()方法必须是public访问权限,返回值

QT多线程笔记

1.QT多线程涉及到主线程和子线程之间交互大量数据的时候,使用QThread并不方便,因为run()函数本身不能接受任何参数,因此只能通过信号和槽的交互来获取数据,如果只是单方面简单交互数据还过得去,如果涉及多次主.子线程之间的交互的时候,这种方式是很不方便的,这里采取另外一种方式,建一个继承自QObject的类,进行movetoThread()操作: class FileThread :public QObject { Q_OBJECT public: QString m_path; QFil

Java基础知识强化之多线程笔记01:多线程基础知识(详见Android(java)笔记61~76)

1. 基础知识: Android(java)学习笔记61:多线程程序的引入    ~    Android(java)学习笔记76:多线程-定时器概述和使用 

Java多线程笔记

1.并发通常可以提高单处理器上程序的性能 其实,在单处理器上并发的执行程序锁用的开销大于顺序执行.然而顺序执行时,程序有时会因为某些条件(通常是I/O问题)导致不能继续执行,称为线程阻塞,如果没有并发,程序将停止不前.而使用了并发,一个任务阻塞,其他任务还可以继续执行,这就保证了程序的完成.所以,如果确定没有任务会出现阻塞,在单处理器上并发执行程序是不必要的. 2.并发在单处理器上性能提高最常见的实例是--事件驱动的编程 并发最吸引人的额就是可以产生可响应的用户界面,比如某个程序将长期的运行某个

多线程笔记--原子操作Interlocked系列函数

前面写了一个多线程报数的功能,为了描述方便和代码简洁起见,只输出最后的报数结果来观察程序运行结果.这非常类似一个网站的客户访问统计,每个用户登录用一个线程模拟,线程运行时将一个表示计数的变量递增.程序在最后输出这个计数的值表示今天有多少用户登录.如果这个值不等于我们启动的线程个数,那这个程序就是有问题的. #include <stdio.h> #include <process.h> #include <Windows.h> volatile long g_nLogin

多线程笔记 - day01

1.基本概念 01-进程 进程是指在系统中正在运行的一个运行程序.每个进程之间是独立的,每个进程均在其专用且受保护的内存空间内. 02-线程 2-1 基本概念 1进程要执行任务,一定要有线程(每个进程至少一个线程),线程是进程的基本执行单位,一个进程(程序)的所有任务都在线程中执行. 2-2 线程的串行 1个线程中任务的执行是串行的,如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务.也就是说,在同一时间内,1个线程只能执行1个任务. 03 多线程 3-1 基本概念 即1个进程

java多线程笔记(二)

      java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Semaphore.   线程同步问题引入:       创建一个银行账户Account类,在创建并启动100个线程往同一个Account类实例里面添加一块钱.在没有使用上面三种方法的情况下: 代码: import java.util.concurrent.ExecutorService; import

java 多线程笔记

一.先简单粗暴解释一下一些与线程有关的概念 1.并行与并发 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时. 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时. 2.资源共享 多个线程调用资源,是同一个或多个资源. 3.线程安全 在并发的情况之下,代码经过多线程使用,线程的调度顺序不影响最后结果,则是线程安全的. 3.同步 Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全.例如使用@synchronized.

多线程笔记小记

多线程编程:1. 调用某个对象的wait()方法,相当于让当前线程交出此对象的monitor(锁.监视器),然后进入等待状态,等待后续再次获得此对象的锁(Thread类中的sleep方法使当前线程暂停执行一段时间,从而让其他线程有机会继续执行,但它并不释放对象锁):2. 如果调用某个对象的wait()方法,当前线程必须拥有这个对象的monitor(即锁),因此调用wait()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法). 调用某个对象的noti

Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. 继承thread类 1 package com.threadtest; 2 clas