核心執行緒之間的同步,R3執行緒和核心執行緒的同步

2021-10-16 22:57:08 字數 3981 閱讀 2795

當執行緒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.互斥鎖線程控制 互斥鎖是用一種簡單的加鎖方法來控制對共享資源的原子操作。互斥鎖只有兩種狀態,也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全域性變數。在同一時刻只能有乙個執行緒掌握某個互斥鎖,擁有上鎖狀態的執行緒能夠對共享資源進行操作。若其他執行緒希望上鎖一 個已經被上鎖的互斥鎖,則該執行緒就會...

執行緒和程序之間的關係

一 程序 每個程式都會有程序負責管理程式功能的各個功能的進行,程序只有乙個,且至少會有乙個 二 執行緒 每個程序裡面至少有乙個執行緒,稱之為主線程,除此之外還會有其他的執行緒,稱之為分執行緒,執行緒是控制任務執行的祖先歐單位 二者之間的聯絡 程序負責各個執行緒的執行,當程式執行,程序啟動,程式關閉,...