詳細注釋 簡單明瞭的C 執行緒池模板

2021-09-27 08:34:56 字數 2954 閱讀 2453

執行緒池需要的:

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