首页 > 代码库 > 一种线程调度策略【线程需要的时候运行,不需要的时候暂停】
一种线程调度策略【线程需要的时候运行,不需要的时候暂停】
1.背景
比如注册用户的时候需要发送邮件,但是发送邮件有一定的延时,所以注册的时候是发邮件的同时,返回注册成功给用户,而发邮件则由发邮件线程处理?如何处理发邮件的线程呢?我目前想到的有:1.每次需要运行时临时创建线程;2.线程每次执行完毕后自行Sleep一定的时间,等待结束后检查是否有需要运行的必要,否则进入Sleep。第一个方法由于每次都要起一个线程,然后又关掉线程,反反复复不好,而且还有其他隐患。第二种呢,只创建一次线程,但是由于有一个Sleep过程,所以发邮件有一定的延时,也不是太好。我目前想到的方法是,邮件发送完毕后线程自己陷入暂停状态,而需要发送邮件时,发送邮件的地方又启动线程。但是由于在当前线程不能自己SupendThread自己,所以需要采用取巧的方法。具体实现见下。
2.示例
#include <stdio.h> #include <process.h> #include <Windows.h> class CUser { public: HANDLE m_hThr; void Suppend() { SuspendThread(m_hThr); } }; unsigned _stdcall ThrTest(VOID* pPara) { CUser* p = (CUser*)pPara; int a = 0; while(1) { printf("Send email success -> %d\n", ++a); // 自陷如暂停状态 p->Suppend(); } return 0; } int main() { CUser* p = new CUser(); // 创建发邮件线程,创建时挂起 p->m_hThr = (HANDLE)_beginthreadex(NULL, 0, ThrTest, p, CREATE_SUSPENDED, NULL); while(1) { // 需要启动线程 ResumeThread(p->m_hThr); Sleep(1500); } CloseHandle(p->m_hThr); delete p; p = NULL; return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。