#pragma once
#include #include #include #include using namespace std;
class itask ;
virtual ~itask() {};
public:
virtual void runitask() = 0;
};class cthreadpool
;
#include "cthreadpool.h"
cthreadpool::cthreadpool()
cthreadpool::~cthreadpool()
bool cthreadpool::createthreadpool(long minthreadnum, long maxthreadnum)
m_hsemaphore = createsemaphore(null, 0, maxthreadnum, null); //初始化
for (int i = 0; i < minthreadnum; i++) }
m_lcrethreadnum = minthreadnum;
m_lmaxthreadnum = maxthreadnum;
return true;
}void cthreadpool::destroythreadpool()
closehandle(*ite);
*ite = null;
ite++;
} m_lstthread.clear();
if (m_hsemaphore)
auto ite2 = m_itask.begin();
while (ite2 != m_itask.end())
deletecriticalsection(&m_cs); //刪除關鍵段
}unsigned _stdcall cthreadpool::threadproc(void *lpvoid)
interlockedincrement(&pthis->m_lrunthreadnum);
//此處是需要互斥進入的**段
while (!pthis->m_itask.empty() && pthis->m_flagquit)
interlockeddecrement(&pthis->m_lrunthreadnum);
} return 0;
}bool cthreadpool::push(itask *ptask)
m_itask.push_back(ptask);
//1.如果有空閒執行緒
if (m_lrunthreadnum < m_lcrethreadnum)
//2.沒有空閒執行緒,但沒達到上限
else if (m_lcrethreadnum < m_lmaxthreadnum)
m_lcrethreadnum++;
releasesemaphore(m_hsemaphore, 1, null);
} //3.上限
return true;
}
測試cpp
#include #include "cthreadpool.h"
using namespace std;
class test : public itask
public:
void runitask()
};int main()
system("pause");
}
結果:
跑的太快導致的,正常現象,可以將runitask()也寫入關鍵段。
多執行緒的建立和使用
最近做郵件傳送功能時,客戶端操作程式等待時長,有時候會很長甚至會死執行緒,這個很不利於使用者的體驗,為了解決這個問題,我想到了使用多執行緒,讓系統在後台傳送郵件,使用者操作介面不受影響,從而保證使用者體驗軟體的流暢度。事實上完成後的效果還不錯,系統介面瞬間響應,郵件後台傳送,其快慢程度取決於郵件伺服...
C 建立和運用socket鏈結池
系統採用的就是這種方式。使用者數量足夠多的時候,只須要動態新增鏈結池的數量即可。下面我們用具體的程式來講解下 首先我們宣告乙個socket類 public class xiegousocket 下面的函式是建立 socket鏈結池,這裡為了使 更加清晰,我特地把異常處理部分全部取掉了。public ...
C 的程序建立和使用
最近在做乙個訊息中介軟體裡面涉及到多執行緒程式設計,由於跨平台的原因我採用了boost執行緒庫。在建立執行緒時遇到了幾種執行緒建立方式現總結如下 首先看看boost thread的建構函式吧,boost thread有兩個建構函式 1 thread 構造乙個表示當前執行執行緒的執行緒物件 2 exp...