當執行緒1需要等待執行緒2處理一些事情的時候就用到這種執行緒同步機制
1、事件,訊號燈,互斥體都是執行緒之間通訊的方式,事件的通訊能滿足大部分需求。
2、休眠函式
large_integer sleeptime =
;//定義乙個休眠的時間
sleeptime.quadpart =
-100*10
*100*3
;//這裡是3秒時間
while(1
)
3、核心執行緒例程 需要新增
psterminatesystemthread(0
);
否則即使**全部執行完畢,這個核心執行緒也不會結束。
4、如果乙個事件被設定為通知事件notificationevent
keinitializeevent
(&gkevent,notificationevent,false)
;
,那麼當這個事件被設定成激發態以後,如果還需要用到這個事件進行同步,那麼需要開發人員手動設定為不激發狀態!設定的**keresetevent(&gkevent);,一般只使用一次就用這種
5、如果某個事件設定為同步事件synchronizationevent
那麼當這個事件遇到kewaite等待通過然後系統會自動將事件重置為未激發態
實際就是執行緒1等待執行緒2處理完一些事情,執行緒1在繼續做其它事情
全域性定義:
kevent gkevent =
;//執行緒同步用的資料結構,同步就靠這個結構,這個很重要
byte mmcode[10]
=;//這個是演示記憶體執行緒之間同步資料用的
執行緒1:
這個執行緒從入口函式啟動,這個函式會啟動執行緒二
在這裡插入**片
///
/// 核心執行緒1
///
///
void kernelthread1
(pvoid context)
//dbgprint("event has be seted\n");
}psterminatesystemthread(0);}
執行緒2:
執行緒1要等待這個執行緒處理一些事情
///
/// 核心執行緒2
///
///
void kernelthread2
(pvoid context)
;//定義乙個休眠的時間
pkevent pevent =
(pkevent)context;
sleeptime.quadpart =
-1000*10
*100*3
;//這裡是3秒時間
pvoid apiddr =
null
; unicode_string apiname =
;rtlinitunicodestring
(&apiname, l"ntcreatefile");
apiddr =
mmgetsystemroutineaddress
(&apiname)
;while(1
)psterminatesystemthread(0);}
入口函式啟動執行緒1**:
//-----建立乙個核心執行緒程序開始----
handle hthread =
null;
status =
pscreatesystemthread
(&hthread,0,
null
,null
,null
, kernelthread1,
(pvoid)
&gkevent)
;//********建立乙個核心執行緒程序結束*******
應用場景
核心層與應用層通過乙個檔案,或登錄檔來互動資料
執行流程:r3應用層主程式裡面:
//引數2false 決定是乙個同步事件件
handle hevent =
createevent
(null
, false, false,
null);
//建立乙個事件
if(hevent == invalid_handle_value)
deviceiocontrol
(hdevice, ioctl_mul,
&hevent,
sizeof
(handle)
,&b,4,
&bread,
null);
//把控制代碼傳到核心
handle thread =
(handle)
_beginthread
(testthread,0,
&hevent)
;//執行執行緒
r3應用層 執行緒函式
///
/// 與核心通訊的執行緒函式
///
///
void
testthread
(pvoid context)
}
核心層需要的全域性變數:
pkevent pkernelevent =
null
;// 應用層控制代碼 轉化為物件後儲存的位置
核心函式執行執行緒的**:
通過自定義的派遣函式,來執行核心執行緒與應用層程式通訊
/*
mycontrol 自定義控制 函式
*/ntstatus mycontrol
(pdevice_object pdevice, pirp pirp)
indata = indata *5;
*(pdword)pirp->associatedirp.systembuffer = indata;
ioinfo =
666;
break;}
default
://如果不是我們要的操作符合,就判斷為失敗
status = status_unsuccessful;
ioinfo =0;
break;}
pirp->iostatus.status = status;
//請求成功
pirp->iostatus.information = ioinfo;
//資訊處理了0位元組
iocompleterequest
(pirp, io_no_increment)
;//完成請求
return status_success;
}
核心層執行緒函式:
///
/// 與應用層同步的執行緒
///
///
void kernelthread3
(pvoid context)
; timeout.quadpart =
-1000*10
*1000*15
; ntstatus status = status_success;
while(1
)////在這個位置 取出r3的資料,然後進行讀寫,再把資料寫回,共享檔案、或登錄檔
執行緒之間和程序之間的同步
今天學習的內容為 利用互斥事件來控制線程之間 程序之間的同步問題。其實,程序之間的同步也就類似於執行緒之間的同步。互斥事件的作用就是為了保證任乙個時間內,只有乙個執行緒對對公共資源進行操作。下面來看一下執行緒之間的同步,如果是在乙個程序內的執行緒同步問題的話。這樣的例子很多,我就舉乙個最簡單的,執行...
執行緒之間的同步和互斥
1.互斥鎖線程控制 互斥鎖是用一種簡單的加鎖方法來控制對共享資源的原子操作。互斥鎖只有兩種狀態,也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全域性變數。在同一時刻只能有乙個執行緒掌握某個互斥鎖,擁有上鎖狀態的執行緒能夠對共享資源進行操作。若其他執行緒希望上鎖一 個已經被上鎖的互斥鎖,則該執行緒就會...
執行緒和程序之間的關係
一 程序 每個程式都會有程序負責管理程式功能的各個功能的進行,程序只有乙個,且至少會有乙個 二 執行緒 每個程序裡面至少有乙個執行緒,稱之為主線程,除此之外還會有其他的執行緒,稱之為分執行緒,執行緒是控制任務執行的祖先歐單位 二者之間的聯絡 程序負責各個執行緒的執行,當程式執行,程序啟動,程式關閉,...