(1) 线程的创建:(主要以下2种)
CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID lParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);
DWORD WINAPI myroutine(LPVOID param)
{
printf("%d,hello from subroutine!\n",*((int*)param));
return NULL;
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("hello from main!\n");
int iSub = 11;
DWORD dId;
HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myroutine,(LPVOID)&iSub,0,&dId);
return 0;
}
(2) 结束线程:
BOOL CloseHandle(HANDLE hObject);
BOOLTerminateThread( HANDLEhThread,DWORDdwExitCode);
VOID ExitThread(DWORD dwExitCode);
结束线程最好使用线程函数返回,TerminateThread和ExitThread这2种方式都不推荐使用,也尽量不用。
( 3 ) 线程的暂停/重启:
DWORD SuspendThread( HANDLE hThread );
DWORD ResumeThread( HANDLE hThread );
( 4 ) 线程优先级:
BOOL SetThreadPriority( HANDLE hThread, int nPriority ); 从主线程继承基础上设置优先级。
( 5 ) 公共资源的并发访问与同步:
临界区:
Critical_Section cs;
void main()
{
InitializeCriticalSection(&cs);
…
DeleteCriticalSection(&cs);
}
DWORD WINAPI mythread(LPVOID param)
{
EnterCriticalSection(&cs); ¬
…//操作。。。
LeaveCriticalSection(&cs);
}
锁机制:
CCriticalSection cs;
void main()
{
}
DWORD WINAPI mythread(LPVOID param)
{
cs.Lock();
…
cs.Unlock();
}
互斥量:
HANDLE hMutex;
void main()
{
hMutex = CreateMutex(NULL,FALSE,”myownmutex”);
…
}
DWORD WINAPI mythread(LPVOID param)
{
WaitForSingleObject(hMutex,INFINITE); ¬
…
ReleaseMutex(hMutex);
}
信号量:
HANDLE hSema;
void main()
{
hSema = CreateSemaphore(NULL,nInit,nMax,”myownsemaphore”);
…
}
DWORD WINAPI mythread(LPVOID param)
{
WaitForSingleObject(hSema,5000L); ¬
…
ReleaseSemaphore(hSema,1,NULL);
}
事件:
HANDLE hEvent;
void main()
{
hEvent = CreateEvent(NULL,FALSE,TRUE,”myownevent”);
…
WaitForSingleObject(hEvent,INFINITE); ¬
}
DWORD WINAPI mythread(LPVOID param)
{
…//操作。。。
SetEvent(hEvent);
}