向指定執行緒插入異常

2021-05-24 15:18:27 字數 1933 閱讀 1194

一:輸入

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...