博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程编程(7) - 从 CreateThread 说起[续五]
阅读量:6574 次
发布时间:2019-06-24

本文共 1943 字,大约阅读时间需要 6 分钟。

  hot3.png

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 应该是最常用的同步手段.
下次接上, 开始学习多线程的同步了.

转载于:https://my.oschina.net/hermer/blog/319277

你可能感兴趣的文章
网络布线线材用量计算公式
查看>>
查询当前数据库用户会话信息
查看>>
创建触发器的基本语法
查看>>
2015.1.15 利用Oracle函数返回表结果 重大技术进步!
查看>>
2015.3.2 VC++6制作非MFC dll以及VS2005、VS2010调用
查看>>
转:模态对话框的支持 (IE,Firefox,Chrome)
查看>>
让您的电脑在任意目录可以支持图片的粘贴,试试看呗~
查看>>
Jenkins+QTP自动化测试框架
查看>>
文件下载
查看>>
《Node.js In Action》笔记之流程控制
查看>>
C++类和对象
查看>>
3518EV200 SDK学习1
查看>>
JavaScript初学者应注意的七个细节
查看>>
1163: 零起点学算法70——Yes,I can!
查看>>
zookeeper原理及作用
查看>>
[ZJOI2015]诸神眷顾的幻想乡
查看>>
oracle之 ORA-12557: TNS: 协议适配器不可加载
查看>>
2018-2019-2 网络对抗技术 20165318 Exp1 PC平台逆向破解
查看>>
关于图片或者文件在数据库的存储方式归纳
查看>>
存储过程和SQL语句比较及存储过程在C#中调用方法
查看>>