孙鑫vc笔记——多线程编程

1.进程是一个正在运行程序的实例,它从不执行任何东西,只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程地址空间中的代码。

2.当创建一个进程时,操作系统会自动创建这个进程的第一个线程,即主线程,即执行main函数或winMain函数的线程,main函数或winMain函数是主线程的进入点函数,此后,该线程可以创建其他的线程。

3.系统赋予每个进程独立的虚拟地址空间,对于32位进程来说,这个地址空间2的32次幂即4GB。

4.每个进程有它的私有地址空间。假设进程A有一个存放在它地址空间的数据结构,地址为0×12345678,进程B有个不同的数据结构存放在它的地址空间中,地址是0×12345678,当进程A中运行的线程访问地址为0×12345678的内存时,访问的是A的数据结构,当进程B中运行的线程访问地址为0×12345678的内存时,访问的是B的数据结构。进程A中运行的线程不能访问进程B的地址空间中的数据结构。

5.页文件在磁盘上划分一块空间当作内存使用,增加内存数量,这样的内存叫作虚拟内存。

6.4GB虚拟地址空间中,2GB是内核方式分区,供内核代码设备驱动程序等使用,而用户方式分区的地址空间为2GB,这个分区是进程的私有地址空间。一个进程不能以读取、写入或以任何方式访问驻留在该分区中的另一个进程的数据。

7.线程组成,线程由两部分组成

1) 线程内核对象。当创建一个线程时,系统会创建一个线程内核对象,这个对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。

2) 线程堆栈。用于维护线程在执行代码时所需的所有参数和局部变量。

8.线程只有一个内核对象和一个堆栈,所需的内存很少。因为线程需要的开销比较少,因此在编程时经常采用多线程来解决问题,而尽量避免创建新的进程。

9.操作系统为每一个运行线程安排一定的CPU时间片。线程在自己的时间片内运行,因时间片相当短,因此给用户的感觉就像线程同时运行一样。当计算机拥有多个CPU,线程就能真正的同时运行了。

10.在多线程程序中,主线程结束程序就退出,因此使用sleep函数使主线程睡眠,则执行其他线程,其他线程交替执行。

11.线程交替执行时,当一个线程开始执行,是从它上次暂停的位置开始执行,如果多个线程共用资源,有时造成错误,因此要使用线程同步机制。

12.互斥对象

1) 互斥对象属于内核对象,它能确保线程拥有对单个资源的互斥访问权。

2) 互斥对象包括一个使用数量、一个线程ID、一个计数器。

3) ID用于标识系统中哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。

13.创建互斥对象函数CreateMutex

1) 第二个参数表示创建互斥对象的线程是否拥有互斥对象。

2) 因为互斥对象是共有的,所以一般声明为全局变量。

3) 第三个参数指定互斥对象名次,为null则匿名互斥对象,不为nul则是命名互斥对象,当是命名互斥对象时,如果该互斥对象先前已被创建,则返回已创建的互斥对象,创建互斥对象后调用GetLastError函数,根据GetLastError返回值判断该互斥对象是否被创建。利用这一特点可保证应用程序只有一个实例在运行。

14.请求互斥对象函数WaitForSingleObject

1) 第一个参数是请求的互斥对象的句柄,当该互斥对象有信号状态时,函数返回。

2) 第二个参数是时间,当到了这个时间时,不管请求的互斥对象是否有信号,函数返回,设为0则立即返回,设为INFINITE则一直等待请求对象的信号状态。此时调用这个函数的线程暂停执行,等待互斥对象。

3) 当没有线程拥有互斥对象时,互斥对象为有信号状态。

4) 当拥有互斥对象的线程执行后,要释放互斥对象,调用ReleaseMutex函数,如果-1后的计数器为0,操作系统会将互斥对象的线程ID设为0,并设为有信号状态,以便其他线程使用。

15.释放互斥对象函数ReleaseMutex

当释放互斥对象时,操作系统会比较调用这个函数的线程ID与当前拥有互斥对象的线程ID是否相同,不同的不允许释放,因此互斥对象是谁拥有谁释放(不是谁创建谁释放)。

16.当创建互斥对象时,计数器设为1,当请求互斥对象时,计数器+1,释放时-1。如果在一个线程中多次请求互斥对象,就要多次释放。

17.如果一个线程请求互斥对象后未释放,当拥有该线程终止后,操作系统会自动释放互斥对象。

通过请求互斥对象的返回值可判断请求到的互斥对象是被正常释放的还是其拥有者终止后被操作系统释放的。

时间: 2024-11-06 03:27:37

孙鑫vc笔记——多线程编程的相关文章

【同步】孙鑫VC++笔记-事件对象同步

事件对象同步 //CreateEvent设置自定的,并且初始有信号#include<windows.h> #include<iostream.h> DWORD WINAPI ThreadProc1( LPVOID lpParameter ); DWORD WINAPI ThreadProc2( LPVOID lpParameter ); int tickes=100; HANDLE g_hEvent; int main() { HANDLE hThread1=CreateThrea

孙鑫VC++视频教程笔记

写在前面的话:在学习孙鑫老师的VC++视频时,为了加深自己对知识的深入理解,就做了下面的笔记. 第一讲: 第二讲: 第三讲: 第四讲: 第五讲: 第六讲: 第七讲: 第八讲: 第九讲: 第十讲: 第十一讲: 第十二讲: 第十三讲: 第十四讲: 第十五讲: 第十六讲: 第十七讲: 第十八讲: 第十九讲:动态链接库 第二十讲: 孙鑫VC++视频教程笔记,布布扣,bubuko.com

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

Linux程序设计学习笔记----多线程编程之线程同步之条件变量

转载请注明出处:http://blog.csdn.net/suool/article/details/38582521. 基本概念与原理 互斥锁能够解决资源的互斥访问,但是在某些情况下,互斥并不能解决问题,比如两个线程需 要互斥的处理各自的操作,但是一个线程的操作仅仅存在一种条件成立的情况下执行,一旦错过不可再重现,由于线程间相互争夺cpu资源,因此在条件成立的时候,该线程不一定争夺到cpu而错过,导致永远得不到执行..... 因此需要某个机制来解决此问题,更重要的是,线程仅仅只有一种情况需要执

Linux程序设计学习笔记----多线程编程基础概念与基本操作

转载请注明出处,http://blog.csdn.net/suool/article/details/38542543,谢谢. 基本概念 线程和进程的对比 用户空间资源对比 每个进程在创建的时候都申请了新的内存空间以存储代码段\数据段\BSS段\堆\栈空间,并且这些的空间的初始化值是父进程空间的,父子进程在创建后不能互访资源. 而每个新创建的线程则仅仅申请了自己的栈,空间,与同进程的其他线程共享该进程的其他数据空间包括代码段\数据段\BSS段\堆以及打开的库,mmap映射的文件与共享的空间,使得

孙鑫VC学习笔记:多线程编程

SkySeraph Dec 11st 2010  HQU Email:[email protected]    QQ:452728574 Latest Modified Date:Dec.11st 2010 HQU ================================================================================= 程序&进程&线程 ================================================

孙鑫VC视频教程观看记录

01: 了解了SDK编程,消息队列,消息响应,消息循环,窗口函数等. 02: 可以冒号:父类构造函数和a(1) protected子类可以访问 覆盖:父类子类之间   重载:同一个类中 ::作用域标识符,表明函数是属于哪一个类的 父类和子类的对象首地址相同 用虚函数实现多态 纯虚函数为子类服务 引用不需要占据内存 可以用预编译指令符解决包含多次重复定义的问题,但是不需要用到定义的值)(定义和没有值不是一个概念,有命名规则是为了避免重复定义,别人也定义了这个宏) 预编译,你加个屁断点 03: 这集

几种画直线的方法-孙鑫C++笔记

// HDC画直线 CPoint m_ptOrigin ; void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptOrigin = point; CView::OnLButtonDown(nFlags, point); } void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { HDC hdc; hdc = ::GetDC(m_hWnd); MoveToEx(hdc,

孙鑫视频VC++深入详解学习笔记

Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Lesson4: 简单绘图 Lesson5: 文本编程 Lesson6: 菜单编程 Lesson7: 对话框编程 Lesson9: 定制应用程序的外观 Lesson10: 绘图控制 Lesson11 图形的保存和重绘 Lesson12 文件操作 Lesson 13: 文档串行化 Lesson14 网络编程 Lesson 15 多线程 Lesson 16 线程同步