模擬
windows執行緒切換(threadswitch)
正在執行的執行緒在kpcr裡,等待的執行緒在等待鍊錶中,排程中的執行緒在那32個排程鍊錶中。
建立它是從下標1的位置開始存的而不是0,因為main需要乙個執行緒。
建立的執行緒還不能排程還需要初始化的環境,暫存器的值、當前執行緒的堆疊要確定
模擬線程切換總結:
執行緒不是被動切換的,而是主動讓出cpu
執行緒切換並沒有使用tss來儲存暫存器,而是使用堆疊.
執行緒切換的過程就是堆疊切換的過程
以下是**:
threadswitch.h
#pragma once#includethreadswitch.c#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();
#include "main.cthreadswitch.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
;}
#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...