?? mythread_win32.c
字號:
/*
*
*mythread_win32.c 封裝線程接口 lin shao chuan
*
*/
#include "mythread.h"
#include <assert.h>
#include <process.h>
#include "mylog.h"
enum THREAD_EXCEPTION
{
THREAD_EC_CANCEL,
};
typedef struct __mythread_t_
{
//本對象內(nèi)存池標識
HMYMEMPOOL hm;
//起始地址與用戶參數(shù)
MY_THREAD_FUN fun;
void * userdata;
//線程id與句柄
DWORD thr_id;
HANDLE hthr;
}mythread_t;
static void
ExceptionFilter (EXCEPTION_POINTERS * ep)
{}
static int __stdcall threadfun(void * data)
{
//運行用戶的線程函數(shù);
//利用捕捉異常機制自然退出線程
mythread_t * mt = (mythread_t *)data;
assert(mt && mt->fun);
__try
{
mt->fun(mt->userdata);
}
__except( ExceptionFilter(GetExceptionInformation()) )
{}
return 0;
}
static void throw_exception(DWORD ec, DWORD p)
{
DWORD exceptionInformation = (DWORD) (p);
# pragma warning (disable:4133)
RaiseException ( ec, 0, 1, &exceptionInformation );
}
static void throw_exception_cancel()
{
//c代碼,ExitThread是一個安全的函數(shù), 如果c++將會導(dǎo)致析構(gòu)函數(shù)無法調(diào)用
ExitThread(0);
//throw_exception(THREAD_EC_CANCEL, 0);
//never reach
assert(0);
}
static void mythread_cancel(mythread_t * mt)
{
//掛起線程
SuspendThread(mt->hthr);
{
//from pthread_win32
CONTEXT context;
context.ContextFlags = CONTEXT_CONTROL;
GetThreadContext( mt->hthr, &context );
# pragma warning (disable:4311)
context.Eip = (DWORD)throw_exception_cancel;
SetThreadContext( mt->hthr, &context );
}
ResumeThread(mt->hthr);
}
/*
*
*創(chuàng)建線程
*
*/
HMYTHREAD MyThreadConstruct(MY_THREAD_FUN fun, void * data, int bsuspend, HMYMEMPOOL hm)
{
mythread_t * mt = MyMemPoolMalloc(hm, sizeof(*mt));
if(NULL == mt)
return NULL;
mt->fun = fun;
mt->userdata = data;
mt->hm = hm;
//掛起創(chuàng)建
mt->hthr = (HANDLE)_beginthreadex(NULL, 0, threadfun, (void *)mt, CREATE_SUSPENDED, &mt->thr_id);
if(NULL == mt->hthr)
{
LOG_WARN(("fail create thread"));
MyMemPoolFree(hm, mt);
return NULL;
}
if(!bsuspend)
ResumeThread(mt->hthr);
return (HMYTHREAD)mt;
}
/*
*
*銷毀線程
*
*/
void MyThreadDestruct(HMYTHREAD ht)
{
mythread_t * mt = (mythread_t *)ht;
if(NULL == mt)
return;
assert(mt->hthr);
//利用異常自然退出線程
mythread_cancel(mt);
CloseHandle(mt->hthr);
MyMemPoolFree(mt->hm, mt);
}
/*
*
*運行線程
*
*/
void MyThreadRun(HMYTHREAD ht)
{
mythread_t * mt = (mythread_t *)ht;
if(NULL == mt)
return;
assert(mt->hthr);
ResumeThread(mt->hthr);
}
/*
*
*線程掛起
*
*/
void MyThreadSuspend(HMYTHREAD ht)
{
mythread_t * mt = (mythread_t *)ht;
if(NULL == mt)
return;
assert(mt->hthr);
SuspendThread(mt->hthr);
}
/*
*
*等待線程退出
*
*/
void MyThreadJoin(HMYTHREAD ht)
{
mythread_t * mt = (mythread_t *)ht;
if(NULL == mt)
return;
assert(mt->hthr);
WaitForSingleObject(mt->hthr, INFINITE);
}
/*
*
* 判斷呼叫此函數(shù)的線程是否就是ht本身
* 1:表示是, 0:表示否
*
*/
int MyThreadInMyContext(HMYTHREAD ht)
{
unsigned long temp = 0;
mythread_t * mt = (mythread_t *)ht;
if(NULL == mt)
return 0;
temp = GetCurrentThreadId();
return ((temp == mt->thr_id) ? 1 : 0);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -