程序:计算机指令的集合,以文件形式(exe格式)存储在磁盘上
进程:一个运行程序的实例,一个程序可以有多个进程(实例),每个进程有他自己的内核对象和私有地址空间(占用较多系统资源)
线程:
●进程是线程的容器,一个进程中至少要有一个主线程(创建进程实例时操作系统自动创建该主线程),一般有多个线程,线程才是真正执行代码的主体。
●每个线程有自己的内核对象和堆栈(占用系统资源较少),单个进程中的多个线程可以相互通信(访问进程内核对象中的句柄和其他线程的堆栈)
●线程可以 “并发” 运行,从而提高程序的执行效率;
●不要没有限制的去开线程,线程太多了,CPU调度切换线程的时间就会增多,结果适得其反(CPU时间片)
●此外线程间的同步问题:虽然Windows为我们提供了好多种方法实现线程间同步,但还是要小心谨慎,切勿粗心大意,否则程序出问题了,都不知道问题出在哪。
●如果做服务器确实要处理成千上万个客服端请求的话,可以用线程池,具体线程池方面的知识大家可以在理解了线程的核心思想后,去网上找下这方面的资料……
●创建线程API函数:CreateThread(…) 具体参数的解释,我们到MSDN上面看……之后写代码。
MFC类中创建线程函数:AfxBeginThread(…) 最终调用的也是CreateThread,只是把一些常用的参数赋上默认的值了。
MFC封装的线程类是CWinThread,我们今天尝试自己封装一个自己的线程类,方便以后使用
①、预备知识:
1、线程基本知识
2、线程的创建、同步
②、相关函数与说明
1、创建线程
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpsa, //线程的安全属性,一般为NULL
DWORD cbStack, //堆栈大小
LPTHREAD_START_ROUTINE lpStartAddr, //线程的回调函数,需要强制转换为LPTHREAD_START_ROUTINE
LPVOID lpvThreadParam, //运行时传入的参数,一般为this指针
DWORD fdwCreate, //创建线程时的标志(是否立即运行等)
LPDWORD lpIDThread); //返回的线程ID
void CThread::Start()
{
DWORD dwThreadID;
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, this, NULL, &dwThreadID);
ASSERT(hThread);
m_hThread = hThread;
}
2、回调函数:
DWORD CThread::ThreadProc(LPVOID pParam)
{
CThread *pThread = (CThread*)pParam;
ASSERT(pThread);
while(pThread->m_bExit)
{
pThread->Run();
}
return 1;
}
3、退出线程:
void CThread::Stop()
{
if(m_hThread)
{
m_bExit = TRUE;
WaitForSingleObject(m_hThread, INFINITE);//当线程的回调函数执行完一次或超过等待时间后会产生一次触发信号,表示可以退出了
CloseHandle(m_hThread);
//m_bExit = FALSE;
m_hThread = NULL;
}
}
4、额外参数传递:
void CThread::SetThreadData(DWORD dwParam)
{
if(m_dwParam!=dwParam)
{
m_dwParam = dwParam;
}
}
DWORD CThread::GetThreadData()
{
return m_dwParam;
}
5、线程的同步
vector<CString> m_vecLog;
CCriticalSection m_cs;//临界资源对象
m_cs.Lock();
m_vecLog.push_back(strLog);
m_cs.Unlock();
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36747.html