5 模擬線程切換

2022-05-10 14:52:30 字數 2479 閱讀 1499

模擬

windows執行緒切換(threadswitch)

正在執行的執行緒在kpcr裡,等待的執行緒在等待鍊錶中,排程中的執行緒在那32個排程鍊錶中。

建立它是從下標1的位置開始存的而不是0,因為main需要乙個執行緒。

建立的執行緒還不能排程還需要初始化的環境,暫存器的值、當前執行緒的堆疊要確定

模擬線程切換總結:

執行緒不是被動切換的,而是主動讓出cpu

執行緒切換並沒有使用tss來儲存暫存器,而是使用堆疊.

執行緒切換的過程就是堆疊切換的過程

以下是**:

threadswitch.h

#pragma once#include 

#include

"stdio.h"//

最大支援的執行緒數

#define maxgmthread 100

//執行緒資訊的結構

typedef struct

gmthread_t;

void gmsleep(int

milliseconds);

int registergmthread(char* name, void(*func)(void*lpparameter), void*lpparameter);

void scheduling();

threadswitch.c

#include "

threadswitch.h"//

定義執行緒棧的大小

#define gmthreadstacksize 0x80000

//當前執行緒的索引

int currentthreadindex = 0;//

執行緒的列表

gmthread_t gmthreadlist[maxgmthread] = ;

//執行緒狀態的標誌

enum

flags;//

啟動執行緒的函式

void gmthreadstartup(gmthread_t*gmthreadp)

//空閒執行緒的函式

void idlegmthread(void*lpparameter)

//向棧中壓入乙個uint值

void pushstack(unsigned int** stackpp, unsigned int

v)//

初始化執行緒的資訊

void initgmthread(gmthread_t* gmthreadp, char* name, void(*func)(void* lpparameter), void*lpparameter)

//將乙個函式註冊為單獨執行緒執行

int registergmthread(char* name, void(*func)(void*lpparameter), void*lpparameter)

}initgmthread(&gmthreadlist[i], name, func, lpparameter);

return (i & 0x55aa0000);}

//切換執行緒 1:當前執行緒結構體指標 2:要切換的執行緒結構體指標

__declspec(naked) void switchcontext(gmthread_t* srcgmthreadp, gmthread_t*dstgmthreadp)}//

這個函式會讓出cpu,從佇列裡重新選擇乙個執行緒執行

void

scheduling()

}if (gmthreadlist[i].flags &gmthread_ready)

}currentthreadindex = dstgmthreadp -gmthreadlist;

switchcontext(srcgmthreadp, dstgmthreadp);

return;}

void gmsleep(int

milliseconds)

scheduling();

return

;}

main.c

#include "

threadswitch.h

"extern

intcurrentthreadindex;

extern

gmthread_t gmthreadlist[maxgmthread];

void thread1(void*)

}void thread2(void*)

}void thread3(void*)

}void thread4(void*)

}int

main()

return0;

}

模擬線程死鎖

b color blue synchronized 特點 color b 兩個synchronized 方法,當乙個執行緒已經獲取鎖定,其它執行緒就不能再執行 color red b 同一例項 b color 的synchronized 方法.b color red 非 color b synchr...

C語言 模擬線程池

題目 執行緒池 是一種多工處理模型,由乙個任務佇列和若干工作執行緒組成 任務佇列 任務佇列包含若干任務 1.每個任務包含指向任務資料的指標和處理該任務的函式指標 2.可以向任務佇列追加新任務 工作執行緒 每個工作執行緒執行乙個任務佇列處理函式 1.核心功能是從佇列中獲取乙個可用任務 1.如果佇列中有...

nodejs 模擬非同步執行,模擬線程暫停

模擬非同步執行,模擬線程暫停,這裡使用了 es7 中的async 和 await,如下 1 模擬線程暫停 2 const sleep function time time 7 8return promise 9 1011 async function asynctest i 16 i 17 awai...