執行緒池需要的:
1.執行緒池的h和cpp檔案(執行緒池建立,執行,新增任務,喚醒執行緒工作,銷毀)
2.任務的h和cpp檔案,(任務型別的建立,任務需要做的事),這裡為了簡單。我建立的任務就是簡單列印執行緒執行的資訊。具體任務可以自己定義。我在自己的http伺服器上就定義的是epoll建立監聽連線的任務
3.鎖的h和cpp檔案。用了互斥鎖(mutex)和條件變數(condition_variable)來保證訊息佇列的任務只能乙個執行緒拿到並且執行
threadpoll.h
#pragma once
#include "locker.h"
#include using namespace std;
template< typename t >
class threadpool ;
threadpool.cpp
#include"threadpool.h"
template< typename t >
threadpool::threadpool( int thread_num ) :thread_number(thread_num),
threads(null), m_stop(false)
// 建立陣列存放執行緒號
threads = new pthread_t[ thread_number ];
if( !threads )
// 建立規定數量的執行緒
for( int i = 0; i < thread_number; i++ )
// 將執行緒進行脫離,執行緒執行完後自動**,避免使用主線程進行join等待其結束
if( pthread_detach( threads[i] ) )
}}// 析構函式中,將m_stop置true,此時將阻塞中的所有執行緒喚醒
// 由於 !m_stop 為false,執行緒會退出迴圈,執行緒結束被**( 詳見函式run() )
// 若不喚醒執行緒,則在程式退出後,執行緒非正常結束,同時會導致
template< typename t >
threadpool::~threadpool()
/* 新增任務時需要先上鎖,並判斷佇列是否為空 */
template< typename t >
queue_mutex_locker.mutex_lock();
bool need_signal = task_queue.empty(); // 記錄新增任務之前佇列是否為空
task_queue.push( task );
queue_mutex_locker.mutex_unlock();
// 如果新增任務之前隊列為空,即所有執行緒都在wait,所以需要喚醒某個執行緒
if( need_signal )
return true;
}//讓執行緒活起來,準備接收工作
template< typename t >
void * threadpool::worker( void *arg )
// 獲取處於隊首的任務,獲取時需要加鎖,避免發生錯誤
// 若隊列為空,則返回null,該執行緒成為等待狀態(詳見函式run())
template< typename t >
t* threadpool::gettask()
queue_mutex_locker.mutex_unlock();
return task;
}template< typename t >
void threadpool::run() else }}
task.h
#pragma once
#include#includeclass task
;task::task()
task::~task()
inline void task::doit()
lock.h
#pragma once
#include #include #include using namespace std;
/* 執行緒鎖 */
class mutexlocker
} ~mutexlocker()
bool mutex_lock()
bool mutex_unlock()
};/* 條件變數 */
class cond
if (pthread_cond_init(&m_cond, null))
} ~cond()
// 等待條件變數,cond與mutex搭配使用,避免造成共享資料的混亂
bool wait()
// 喚醒等待該條件變數的某個執行緒
bool signal()
// 喚醒所有等待該條件變數的執行緒
bool broadcast()
};
main.cpp
#include #include"threads.h"
#include"task.h"
int main()
for (int i = 0; i < n; i++)
std::this_thread::sleep_for(std::chrono::milliseconds(10000));
std::cout << "main id:" << std::this_thread::get_id() << std::endl;
//詳情見threadpool.cpp的run()函式delete task;
return 0;
}
執行截圖如下:
未完成 簡單明瞭的理解c 指標
首先我們要知道,乙個記憶體單元由位址和內容兩部分組成。如上圖,例如我們定義了乙個變數a.通過取位址運算子 他的作用是求乙個變數的位址 我們知道變數a的位址為0x6ffe1c,內容為5。我們在訪問變數a時,通常是直接訪問,例如將a的值改為10,則直接執行a 10 但是除了直接訪問以外,我們可以用一種間...
c 實現簡單的執行緒池
執行緒池,先建立一定數目的執行緒,初始都處於空閒狀態。當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,處理完成之後,該執行緒被重新放回到執行緒池中。當執行緒池中的執行緒都在處理任務時,若有新的任務產生,只能等待,直到執行緒池中有執行緒結束任務空閒才能執行。用c 實現固定執行緒數的執行緒池...
c 實現簡單的執行緒池
c 執行緒池,繼承cdoit,實現其中的start和end 標頭檔案 多執行緒管理類 ifndef cthreadpoolmanage h define cthreadpoolmanage h include include include include include include inclu...