笔记一

context switch 一秒发生数百次,两个线程分别计算pai和一个线程计算两次pai时间消耗不同,因为有context switch,当然多cpu就可以真正实现多线程 (symmetric multi-processing SMP)

race condition 假如你在往文件服务器输入电话号码的同时别人也输入,然后两人都存储了,结果会是最后存储的那个人的纪录保存下来

atomic operation c/c++的源代码编译后产生汇编代码,在c里面是一句的操作,实际运行的时候可能是很多句,看上去在c里面在一句话中间不能被中断,但实际是会被中断的,因为他不是一句操作。而原子操作就不会中断。

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  SIZE_T dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);
1:描述新线程的安全属性
2:新线程的堆栈 缺省0 1兆
3:新线程的起始地址 函数指针 即填入函数名即可
4:被调用函数的参数
5:新线程是否立即执行,允许创建暂停的线程
6:新线程的id,用于别的函数
调用函数如果成功返回TRUE,否则返回FALSE,调用GetLastError获取出错信息

新线程调用函数 要声明为 DWORD WINAPI 型 即__stdcall

线程运行时各个线程之间执行顺序和完成时间不确定、随机、不可复现。线程不总是立即执行


task switch随时可能发生,线程对小的改变有高度敏感。

核心对象 核心对象都具有一个引用计数器(reference counter) 调用closehandle只是让计数器减1并不销毁对象

BOOL CloseHandle(
  HANDLE hObject
);
成功返回TRUE,错误返回FALSE

work线程 不牵扯到图形界面(GUI)的纯运算的线程,如果进程产生很多这样的线程而不关闭,那最终将产生很多,会造成资源泄露。不能因为线程结束核心对象就会被销毁来cleanup,许多对象如文件是被进程拥有的,线程没有权限

为什么可以在不结束线程的情况下closehandle
线程对象和线程是不同的,线程的handle只是一个handle,不是线程实体,当调用closehandle只是表示不打算和这个对象有任何瓜葛,只是计数器减了1,线程核心对象的默认计数器值是2。调用closehandle减1,线程结束减1,然后销毁(假如在没有外界干扰下)

BOOL GetExitCodeThread(
  HANDLE hThread,
  LPDWORD lpExitCode
);
2:指向一个DWORD值保存exitcode
函数调用成功则返回TRUE 否则FALSE,如果线程未结束则lpExitCode值为STILL_ACTIVE。即不能通过判断函数返回值来确定线程是否已经结束,因为线程在运行中也会返回TRUE,只有看lpExitCode。这不是一个判断线程是否已经结束的好办法

void ExitThread(
  DWORD dwExitCode
);
强制结束线程,dwExitCode中存放退出代码

主线程
程序启动后执行的那个线程是主线程,负责GUI消息循环,该线程一旦退出会使程序退出、程序中的所有线程都退出而且没有做清理的机会

微软win32多线程模型
微软强调线程分为GUI线程和worker线程,gui线程负责创建窗口及消息循环,worker线程负责纯数学运算一般而言GUI线程不做那些不能立即完成的事。

                    GUI线程的定义是:拥有消息队列的线程

如果worker线程产生一个窗口,那么会有一个消息队列产生并附着在这个线程上,worker线程摇身一变,成了GUI线程,如果worker线程要求输入输出错误信息,则应该授权给UI线程来做

所谓秘诀
1、各线程的数据要分开,避免使用全局变量

2、不要在线程之间共享GDI对象

3、确定你知道线程状态,不要径自结束程序而不等待线程结束

4、让主线程处理UI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值