一、相关概念
程序:磁盘的可执行文件(如windows的exe,linux的elf文件)
进程:代码执行所需要的所有资源(虚拟内存,堆栈等等)
线程:操作系统能够进行运算调度的最小单位,包含在进程之中
二、线程的创建
HANDLE WINAPI CreateThread(
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全属性
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress, //回调函数地址
__in_opt LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId
);
函数执行成功返回新线程句柄,失败返回null
第二个参数是线程分配的栈空间大小,填0则是默认,每个线程的堆栈空间都是独立的
第三个参数lpStartAddress为回调函数地址,是一个函数指针,指向如下函数:
DWORD WINAPI ThreadProc(
__in LPVOID lpParameter
);
该函数是线程开始执行的位置,参数lpParameter是用户自定义的
第四个参数就是上方回调函数的参数
第五个参数dwCreationFlags是线程创建标志,可以为以下值
0表示线程一创建就开始执行代码,CREATE_SUSPENDED表示将线程先挂起
最后一个参数是传出参数,可以获得线程id,可选项
三、进程的暂停
线程休眠函数:
VOID WINAPI Sleep(
__in DWORD dwMilliseconds //暂停时间,单位毫秒
);
参数值为零表示线程会放弃剩余时间片,但是马上会进入就绪状态,如果值为1则是放弃时间片后休眠1毫秒,然后才恢复,如果没有其他具有相同优先级的线程可以运行,则函数立即返回,线程继续执行。
值为INFINITE(无穷大)表示暂停不应超时
线程挂起(不给线程分配时间片)函数:
DWORD WINAPI SuspendThread(
__in HANDLE hThread //线程句柄
); //线程挂起
DWORD WINAPI ResumeThread(
__in HANDLE hThread
); //线程恢复
四、线程的退出
1.从线程回调函数返回(return)
2.ExitThread函数:
VOID WINAPI ExitThread(
__in DWORD dwExitCode //退出码
);
3.TerminateThread函数
BOOL WINAPI TerminateThread(
__inout HANDLE hThread, //线程句柄
__in DWORD dwExitCode //退出码
);
2和3两个函数使用时要注意资源的释放
示例:
//MFC
DWORD Threadroc(LPVOID lpParameter)
{
//线程回调函数
HWND hw= ::FindWindow(NULL, "thread");
for (int i = 0; i < 10000000; i++)
{
if (flag == false)
{
ExitThread(0);
}
SetDlgItemInt(hw, IDC_EDIT1, i, false);
}
return 0;
}
void CcreatethreadDlg::OnBnClickedButton1()
{
//创建线程
hdthread=CreateThread(NULL, 0,Threadroc,NULL,0,NULL );
if (hdthread == NULL)
{
AfxMessageBox("线程创建失败");
}
}
void CcreatethreadDlg::OnBnClickedButton4()
{
//线程退出
flag = false;
//TerminateThread(hdthread, 0); //结束线程
}
void CcreatethreadDlg::OnBnClickedButton3()
{
//线程挂起
SuspendThread(hdthread);
}
void CcreatethreadDlg::OnBnClickedButton2()
{
//线程恢复
ResumeThread(hdthread);
}