一:輸入
1.handle hthread 執行緒控制代碼
2. void (*throwfun)() 異常函式指標
二:將指定執行緒掛起來
將執行緒掛起來來。暫停執行緒的目的是使執行緒停下來,方便向執行緒的棧空間插入**。也方面除錯**。
suspendthread(hthread)
三:獲取執行緒的當前狀態
通過getthreadcontext獲取執行緒的暫存器的值。主要是要獲取執行緒棧空間的esp指標。以便向執行緒棧空間插入返回位址,模擬成當前執行緒呼叫throwfun。
四:讓執行緒執行輸入的函式指標
首先,向棧空間插入執行緒的當前位址。以便模擬成從該位址呼叫了throwfun
con.esp -= 4;
*(int*)(con.esp) = con.eip;
然後,將執行緒的eip指標直接設定為throwfun的入口。這樣執行緒就會轉到throwfun函式執行。
五:喚醒執行緒
因為執行緒在我們的suspendthread(hthread)呼叫前可能已經被多次的掛起了。為了讓執行緒被真正的被喚醒,需要多次呼叫resumethread直到執行緒被真正的喚醒。
for(unsigned i = 0; i <= count; ++i)
六:如果執行緒呼叫了sleep函式
但是,如果該執行緒已經處在sleep呼叫中,除非sleep的時間到了。否則執行緒不能夠被喚醒的。
為了避免執行緒sleep很長時間,導致插入的異常**不能被立即執行。我們可以將對sleep的長時間呼叫,修改為多次對sleep的短時間呼叫
void my_sleep(unsigned milliseconds)
else}}
這樣,執行緒不會一直處於sleep狀態,當被插入異常**後就可以很快執行到。
七:如果執行緒呼叫了entercriticalsection函式
int my_entercriticalsection (
critical_section& m_cs
unsigned time1,
bool isthrowexception)
if(time > 100)
else
}if(isthrowexception)
return -1;
}八:如果執行緒呼叫了waitforsingleobject函式
int my_waitforsingleobject (
handle m_lock,
unsigned timeout,
bool isthrowexception)
dword result = ::waitforsingleobject(m_lock, len);
if(wait_timeout == result)
if(wait_object_0 == result)
throw(texception());
}if(isthrowexception)
return -1;
}九:如果執行緒呼叫socket的recv函式
void recv(socket m_socket,int len1)
fd_set lst;
fd_zero(&lst);
fd_set(m_socket, &lst);
timeval over_time;
over_time.tv_sec = 0;
over_time.tv_usec = 100;
int select_result = ::select(
1,&lst,
0,0,
&over_time
);if(select_result > 0)}}
十:如果執行緒呼叫socket的send函式
十一:如果執行緒呼叫socket的accept函式
C 多執行緒學習 六 向執行緒傳遞資料和異常處理
向執行緒傳遞資料 如果你想往執行緒的啟動方法中傳遞引數,最簡單的辦法是使用lambda表示式,在裡邊使用引數呼叫方法。在c 3.0之前沒有lambda 表示式,可以使用thread的stat方法來傳遞引數。for text one using system using system.collecti...
VBS 如何向Txt文件中指定行插入內容
引數1 txt檔案 引數2 在第幾行後插入資料 引數3 插入資料內容 call addline c test.txt 2,2 function addline strpath,intline,strinput dim fso,myfile set fso createobject scripting...
向陣列中插入元素
package com.cn.learn.e4 author 0 向陣列中插入元素 public class insert4 5num 原來位置元素向右挪一位 這個迴圈理解上有點難度,首先,i一定是i scores.length 1,如果不減一,會陣列越界 for int i scores.leng...