C 執行緒池的建立和使用

2021-09-28 14:41:46 字數 1977 閱讀 4595

#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...