Windows API 多线程-学习笔记(一)
一, winindows 下多线程的创建与撤销:
windows 下多线程创建函数有两种,一种是调用系统API: CreateThread(), 另一种是调用C运行时函数库_beginthread()或_beginthreadex(),创建线程如果不再使用
//函数原型:
//The thread object remains in the system until the thread has terminated and all handles to it have been closed through a call to CloseHandle.
//创建线程如果不再使用返回的线程句柄,应用CloseHandle关闭,
HANDLE WINAPI CreateThread( __in LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全类型, NULL时为默认安全类型 //可以用SetThreadPriority或GetThreadPriority设定或获得 __in SIZE_T dwStackSize, //线程栈大小 NULL时为默认大小,好像是 1M __in LPTHREAD_START_ROUTINE lpStartAddress, //线程函数地址 __in LPVOID lpParameter, //线程函数的参数,在些传给线程 __in DWORD dwCreationFlags, //线程创建标志 如果是CREATE_SUSPENDED //则线程创建时是暂停的,要用ResumeThread //唤醒线程,如果是NULL则立即进入调度队列 //STACK_SIZE_PARAM_IS_A_RESERVATION与线程栈有关 __out LPDWORD lpThreadId //传入一个DWORD变量地址,获得线程ID,也可传NULL, 可以用GetThreadId获得线程ID ); //结束一个线程, 可以自然的结束.VOID WINAPI ExitThread( __in DWORD dwExitCode );//线程函数模型, ThreadProc可以换成其它自定义的名称DWORD WINAPI ThreadProc( [in] LPVOID lpParameter );
//简单版 (最好不要用,)
uintptr_t _beginthread(
void( *start_address )( void * ), //线程函数地址
unsigned stack_size, //线程栈大小,
void *arglist //线程函数参数
);
// 与C Runtime Library 一起用时没问题(好像是使用了TLS,使原来的全局变量在每个线程中都有,)
uintptr_t _beginthreadex( //与CreateThread一样.
void *security, //安全类型
unsigned stack_size, //线程栈大小
unsigned ( *start_address )( void * ), //线程函数地址
void *arglist, //线程函数参数
unsigned initflag, //线程标志
unsigned *thrdaddr //线程ID
);
//在线程函数中调用,结束调用的线程, 可以自然的结束.
void _endthread( void );
void _endthreadex(
unsigned retval //线程结束代码.
);
//例程(vc2008)
HANDLE h_thread;
DWORD ThreadProc(char* str)
{
for (int i = 0; i != 10; i++)
{
printf("No. %d: %s\n", i, str);
//std::cout << "NO." << i << ": " << str << std::endl;
}
Sleep(5000);
return 0;
}
void TestThread()
{
DWORD thread_id;
h_thread = CreateThread(
NULL,
NULL,
(LPTHREAD_START_ROUTINE)ThreadProc,
(LPVOID)"Test string passed to ThreadProc",
NULL,
&thread_id);
for (int i = 0; i != 10; i++)
{
printf("No. %d: In the main thread.\n", i);
}
WaitForMultipleObjects(
1,
&h_thread,
true,
INFINITE);
CloseHandle(h_thread);
}