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;
    }



  • 相关阅读:
    ini_set /ini_get函数功能-----PHP
    【转】那个什么都懂的家伙
    word 2007为不同页插入不同页眉页脚
    August 26th 2017 Week 34th Saturday
    【2017-11-08】Linux与openCV:opencv版本查看及库文件位置等
    August 25th 2017 Week 34th Friday
    August 24th 2017 Week 34th Thursday
    August 23rd 2017 Week 34th Wednesday
    August 22nd 2017 Week 34th Tuesday
    August 21st 2017 Week 34th Monday
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6732771.html
Copyright © 2011-2022 走看看