《Win32多线程程序设计》CRT中的多线程

来源:互联网 发布:食品零售数据 编辑:程序博客网 时间:2024/06/04 18:16

Q: 再次加深印象volatile
A:
【可以说基本没用到过,所以也总是忘记怎么用。。。】
易变的,这个关键字告诉编译器不要持有变量的临时性拷贝。即不让编译器优化变量,因某些变量值变化频繁时,如果编译器进行优化,则在寄存器中就存储了其变量值,取值也会在存储器中取,这会导致读到的值是过去的某个值,导致错误。
const 和 volatile 都是 ANSI 的标准关键字,所有的 C/C++ 编译器都应该有支持。

Q: 什么是CRT多线程版本
A:
早期,C runtime library 使用数个全局变量和静态变量,如 errno, strtok,数据结构等。这些在多线程中会冲突,故VC提供了两个版本,单线程和多线程。
多线程版本突出区别有,对于errno类似变量每个线程各一份,数据结构以同步机制加以保护。
类别有:
/ML Single-Threaded
/MT Multithreaded(static)
/MD Multithreaded DLL
/MLd Debug Single-Threaded
/MTd Debug Multithreaded(static)
/MDd Debug Multithreaded DLL

Q: 为何选择beginthreadex()更好?
A:
_beginthreadex() 的参数和 CreateThread() 的参数其实完全相同,不过它已经把 Win32 数据类型“净化”过了(译注:意思是使用标准的 C 数据类型,而不再使用 Window s 自定义的数据类型)。这并不好,因为这会妨碍编译器对类型的检验工作。
参数类型被净化,目的是要使这个函数能够移植到其他操作系统。理论上净化了 Win32 数据类型之后, _beginthreadex() 就可以实现于其他平台,因 为 完 全 不 需 要 windows.h 。 不 幸 的 是 由 于 你 还 是 需 要 调 用CloseHandle(),所以你还是需要含入 w indows.h。整个情况似乎是,微软空有一个好主意,但是未能落实它。

函数名称中的下划线符号。它必须存在,因为这不是个标准的 ANSI C runtime library 函数。你不会在 Unix 或 OS/2 的编译器中找到这个函数。

绝 对 不 要 在一个“ 以 _beginthreadex() 启 动 的 线 程 ” 中 调 用ExitThread(),因为这么一来, C runtime library 就没有机会放“为该线程而配置的资源”了。

Q: 在只有Win32 API时如何没有stdio.h时如何进行屏幕输出?
A:
为了避免使用 stdio.h ,有三个不同的问题必须提出来讨论。
第一个问题就是字符串格式化。这可经由 sprintf() 的一个 Windows 兄弟,名为 wsprintf()来解决。 wsprintf() 其实还细分为 _wsprintfA() 和 _wsprintfW() ,前者处理ANSI 字符串,后者处理 U nicode 字符串。这个函数是系统核心的一部分,与C runtime library 没有关系。它的操作与功能和 C runtime 的 sprintf() 大同小异,差别在于对浮点数的处理。
第二个问题是找到 stdin 和 stdout 的替代品,
一 般 而 言 , Win32 程 序 使 用 CreateFile() 、 ReadFile() 、WriteFile() 、CloseHandle()作为其基本 I/O 操作。最后三个函数都需要一个 handle ,此handle 由 CreateFile() 传回。 Win32 之中亦有完全对等于 stdin 、 stdout、 stderr的东西,可以使用 API 函数 GetStdHandle() 获得之。

HANDLE GetStdHandle(DWORD nStdHandle);

可以把这个函数所传回的 handle ,用在 ReadFile() 和 WriteFile() 身上。
最后一个必须解决的问题是,如何直接控制屏幕。
1. 利用 BIOS 显示中断服务函数;
2. 利用对视频显示缓冲区(video buffer)的直接读写;
3. 利用 C runtime conio.h 中的函数;
4. 利用 C runtime stdio.h 中的函数。

【目测本章的实例都比较值得研究,时间关系,留做】