VS C++ 线程篇之一创建线程

创建线程

创建线程方法一、

HANDLE WINAPI CreateThread(

  LPSECURITY_ATTRIBUTES lpThreadAttributes,       // 线程安全属性
  SIZE_T dwStackSize,                                                // 线程堆栈大小
  LPTHREAD_START_ROUTINE lpStartAddress,         // 线程函数地址
  LPVOID lpParameter,                                              // 线程函数参数
  DWORD dwCreationFlags,                                      // 指定线程是否立即启动
  LPDWORD lpThreadId                                            // 存储线程ID号
);

        线程内核对象就是一个包含了线程状态信息的数据结构。每次对CreateThread 的成功调用,系统都会在内部为其分配一个内核对象。
        线程上下文反应了线程上次执行的寄存器状态,来保证线程之间切换(即还原现场)。
        计数器,调用一次OpenThread(CreateThread ),计数器加1,CloseThread(CloseHandle)计数器减一。当计数器值为0时,没有线程使用该内核对象,系统收回内存。计数器的初始值是2(主线程是1,创建的线程是2)。

创建线程方法二、C++底部的,并不是Windows标准API,创建线程函数,该函底层调用CreateThread。

#include 
uintptr_t _beginthreadex( 
   void *security,		// 线程安全属性
   unsigned stack_size,  // 线程堆栈大小
   unsigned ( *start_address )( void * ),  //线程函数地址
   void *arglist,  //传递给线程函数的参数
   unsigned initflag, // 指定线程是否立即启动
   unsigned *thrdaddr  // 存储线程ID号
);

安全属性

typedef struct _SECURITY_ATTRIBUTES {  

	DWORD nLength;  
	LPVOID lpSecurityDescriptor;  
	BOOL bInheritHandle;                //设置该句柄可以继承
} SECURITY_ATTRIBUTES,  
  *PSECURITY_ATTRIBUTES,  
  *LPSECURITY_ATTRIBUTES;

线程终止

    线程函数退出。

        线程使用的堆栈被释放。
        dwExitCode设置为线程函数的返回值。
        递减内核中的code值,让内核的引用计数减一。

// 结束线程调用,终止自己
VOID WINAPI ExitThread(
  __in DWORD dwExitCode	  // 线程结束时的退出码
);
// 由当前线程终止其他线程
BOOL WINAPI TerminateThread(
  __in_out HANDLE hThread,  // 终止的线程句柄
  __in DWORD dwExitCode     // 退出码
);
// 进程退出
VOID WINAPI ExitProcess(
  __in UINT uExitCode   // 退出码
);
void _endthreadex( 
   unsigned retval     // 退出码 
);

例程1:

#include 
#include 
#include 


DWORD WINAPI ThreadProFunc(LPVOID lpParam);

int main(int argc, char **argv)
{
	HANDLE hThread;
	DWORD dwThreadId;
	
	hThread = CreateThread( NULL	// 默认安全属性
						, NULL		// 默认堆栈大小
						, ThreadProFunc // 线程入口地址
						, NULL	//传递给线程函数的参数
						, 0		// 指定线程立即运行
						, &dwThreadId	//线程ID号
						);

	for(int i = 0; i < 4; i++) {
		printf("nihao\n");
	}

	CloseHandle(hThread);	//关闭线程句柄,内核引用计数减一

	system("pause");
	return 0;
}

DWORD WINAPI ThreadProFunc(LPVOID lpParam)
{
	for(int i = 0; i < 4; i++) {
		printf("hello\n");
	}
	return 0;
}

运行结果:

nihao
hello
hello
nihao
hello
nihao
nihao
hello
请按任意键继续. . .


例程2:

#include 
#include 
#include 
#include 

unsigned int WINAPI ThreadProFunc(void *pParam);

int main(int argc, char **argv)
{
	HANDLE hThread;
	unsigned int threadId;

	hThread = (HANDLE)_beginthreadex(NULL, NULL, ThreadProFunc,NULL, 0, &threadId); 

	for(int i = 0; i < 4; i++) {
		printf("nihao\n");
	}

	CloseHandle(hThread);	//关闭线程句柄

	system("pause");
	return 0;
}

unsigned int WINAPI ThreadProFunc(void *pParam)
{
	for(int i = 0; i < 4; i++) {
		printf("hello\n");
	}
	return 0;
}

运行结果

nihao
hello
hello
nihao
hello
nihao
nihao
hello
请按任意键继续. . .


你可能感兴趣的:(VS)