Win32多线程程序设计(侯捷翻译) 学习笔记1

最近实验室的项目需要用到多线程,一般书上面的都是浅尝辄止,不够深入,并且项目是在evc上开发的,必须用到win32API中的函数,找到了这本书来学学基础知识.

原子操作:一个操作如果能够不受中断的完成,atomic operation,例如:线程间的资源锁定之操作:如设置flag=1;和检查flag的操作必须在汇编级别-机器执行码级别为原子操作.如果它被中断,就会产生一个race condition(竞争条件)

contex switch:cpu同一个时刻只能执行一个线程,当它执行第二个线程时会先切换上下文,将前一个线程的
寄存器信息保存,1秒内可能有几百次切换

线程创建函数CreateThread()的返回值:1 handle-大部分和线程有关的api函数都需要它2 lpThreadId带回来的线程ID,是个全局变量可以独一无二的表示系统任一进程中的某个线程,AttachThreadInput()和PostThreadMessage()就需要用到线程ID,这两个函数允许你影响其他线程的消息队列.调试器和进程观察器也需要线程ID,由于安全防护的缘故你不可能根据线程ID就得到其handle

handle:句柄,核心对象kernel object,是指向指针的指针,比指针更安全.指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。当你需要对某个内存进行直接操作时,可以使用GlobalLock锁住这段内存并获得指针来直接进行操作。

核心对象:进程process,线程thread,文件file,事件event,信号量semaphores,互斥体mutexes,管道pipe(named&anonymous),核心对象可以有一个以上的拥有者,甚至可以跨进程,GDI对象有单一拥有者,不是进程就是线程为了保持对每一位主人-拥有者的追踪,核心对象保持了一个引用计数-reference count,以纪录有多少handles
对应此对象,对象中也纪录了哪一个进程或线程是拥有者,如果你调用CreateThread()或其他会传回handle的函数,
引用计数便累加1,当你调用CloseHandle()时,引用计数便递减1,一旦引用计数降至0,这一核心对象便自动被摧毁
由于引用计数的设计,对象有可能在"产生该对象的进程"结束后还继续幸存,当你完成你的工作之后,应该调用
CloseHandle()释放核心对象,虽然如果一个进程在结束之前如果没有针对它所打开的核心对象调用CloseHandle(),操作系统会自动把那些对象的引用计数下降1.你不可以依赖"因线程的计数而清理所有被这一线程产生的核心对象",许多对象如文件是被进程拥有,而非被线程所拥有,在进程关闭前不能够清理它们.

线程对象和线程的不同:为什么可以在不结束线程的情况下关闭其handle?
线程的handle是指向线程的核心对象,并不是指向线程本身,CloseHandle()函数只不过表明你希望自己和此核心对象没有任何瓜葛,唯一做的事情就是把引用计数减1,如果该值变为0,操作系统会自动摧毁该对象

判断线程是否结束-依赖线程结束而结束:
一个不好方法:
  BOOL GetExitCodeThread(线程handle,LPDWORD接受结束代码用于判断),成功返回true,失败返回false,可以调用GetLastError()找出原因,如果线程已结束那么线程的结束代码=返回值=会被放在第二个参数中带出来,如果尚未结束,带回来的是STILL_ACTIVE,可以解决诸如:当一个后台线程正在打印,如果用户按file/exit会出现什么事?
正确大方法:见后面

强制结束线程:ExitThread(DWORD指定此线程之结束代码);此行下的任何代码绝对不会执行,它可以在任何时候被调用并决不返回任何值.如果线程还在进行而我的程序结束了会怎么样?强迫所有线程结束,其他线程没有机会做清理工作 

暂时发到这里吧,待续.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值