zoukankan      html  css  js  c++  java
  • 一种线程调度策略【线程须要的时候执行,不须要的时候暂停】

    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
    ", ++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;
    }



  • 相关阅读:
    java学习阶段一 方法和文档注释
    java学习阶段一 二维数组
    java学习阶段一 一维数组
    java学习阶段一 循环结构
    java学习阶段一 选择结构
    java学习阶段一 运算符
    oracle学习笔记:修改表空间文件位置
    oracle学习笔记:重建临时表空间
    oracle等待事件1:Failed Logon delay等待事件
    oracle数据库删除归档日志
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6732771.html
Copyright © 2011-2022 走看看