程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 多線程編程(7) - 從 CreateThread 說起[續五]

多線程編程(7) - 從 CreateThread 說起[續五]

編輯:Delphi

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 應該是最常用的同步手段.

  下次接上, 開始學習多線程的同步了.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved