多线程编程(7) - 从 CreateThread 说起[续五]
来源:互联网 发布:剑三成女捏脸数据网盘 编辑:程序博客网 时间:2024/04/28 08:01
function CreateThread( lpThreadAttributes: Pointer; {安全设置} dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;
CreateThread 的第一个参数 lpThreadAttributes 是指向 TSecurityAttributes 结构的指针, 一般都是置为 nil, 这表示没有访问限制; 该结构的定义是:
//TSecurityAttributes(又名: SECURITY_ATTRIBUTES、_SECURITY_ATTRIBUTES)_SECURITY_ATTRIBUTES = record nLength: DWORD; {结构大小} lpSecurityDescriptor: Pointer; {默认 nil; 这是另一个结构 TSecurityDescriptor 的指针} bInheritHandle: BOOL; {默认 False, 表示不可继承}end;//TSecurityDescriptor(又名: SECURITY_DESCRIPTOR、_SECURITY_DESCRIPTOR)_SECURITY_DESCRIPTOR = record Revision: Byte; Sbz1: Byte; Control: SECURITY_DESCRIPTOR_CONTROL; Owner: PSID; Group: PSID; Sacl: PACL; Dacl: PACL;end;
够复杂的, 但我们在多线程编程时不需要去设置它们, 大都是使用默认设置(也就是赋值为 nil).
我觉得有必要在此刻了解的是: 建立系统内核对象时一般都有这个属性(TSecurityAttributes);
在接下来多线程的课题中要使用一些内核对象, 不如先盘点一下, 到时碰到这个属性时给个 nil 即可, 不必再费神.
{建立事件}function CreateEvent( lpEventAttributes: PSecurityAttributes; {!} bManualReset: BOOL; bInitialState: BOOL; lpName: PWideChar): THandle; stdcall;{建立互斥}function CreateMutex( lpMutexAttributes: PSecurityAttributes; {!} bInitialOwner: BOOL; lpName: PWideChar): THandle; stdcall;{建立信号}function CreateSemaphore( lpSemaphoreAttributes: PSecurityAttributes; {!} lInitialCount: Longint; lMaximumCount: Longint; lpName: PWideChar): THandle; stdcall;{建立等待计时器}function CreateWaitableTimer( lpTimerAttributes: PSecurityAttributes; {!} bManualReset: BOOL; lpTimerName: PWideChar): THandle; stdcall;
上面的四个系统内核对象(事件、互斥、信号、计时器)都是线程同步的手段, 从这也能看出处理线程同步的复杂性; 不过这还不是全部, Windows Vista 开始又增加了 Condition variables(条件变量)、Slim Reader-Writer Locks(读写锁)等同步手段.
不过最简单、最轻便(速度最快)的同步手段还是 CriticalSection(临界区), 但它不属于系统内核对象, 当然也就没有句柄、没有 TSecurityAttributes 这个安全属性, 这也导致它不能跨进程使用; 不过写多线程时一般不用跨进程啊, 所以 CriticalSection 应该是最常用的同步手段.
下次接上, 开始学习多线程的同步了.
转帖:http://www.cnblogs.com/del/archive/2009/02/12/1388955.html
- 多线程编程(7) - 从 CreateThread 说起[续五]
- 多线程编程(7) - 从 CreateThread 说起[续五]
- 多线程编程(6) - 从 CreateThread 说起[续五]
- 多线程编程(3) - 从 CreateThread 说起[续]
- 多线程编程(2) - 从 CreateThread 说起[续]
- 多线程编程(3) - 从 CreateThread 说起[续]
- 多线程编程 - 从 CreateThread 说起
- 多线程编程(4) - 从 CreateThread 说起[续二]
- 多线程编程(5) - 从 CreateThread 说起[续三]
- 多线程编程(6) - 从 CreateThread 说起[续四]
- 多线程编程(3) - 从 CreateThread 说起[续二]
- 多线程编程(4) - 从 CreateThread 说起[续三]
- 多线程编程(5) - 从 CreateThread 说起[续四]
- 多线程编程(4) - 从 CreateThread 说起[续二]
- 多线程编程(5) - 从 CreateThread 说起[续三]
- 多线程编程(6) - 从 CreateThread 说起[续四]
- 多线程编程(2) - 从 CreateThread 说起
- 多线程编程(1)- 从 CreateThread 说起
- 计算程序运行时间
- DOM2和IE的事件传播机制(捕捉,起泡)
- 系统中hosts文件妙用
- 从故乡到深圳
- uart_get_baud_rate
- 多线程编程(7) - 从 CreateThread 说起[续五]
- 无处不抽象,从JVM内存管理想到的
- 不知道做什么?
- struts2中的dojo插件使用
- 简单的点对点聊天软件
- vc++注册表操作
- struts的编写
- java web 下 备份和恢复数据库(sql2005)?求完整代码……
- javascript 在html中使用转义字符