必讀 10分鐘帶你實現執行緒池C 版

2021-10-10 08:48:45 字數 2905 閱讀 5542

5 **解析

6 參考資料

最近在看如何實現自動求導,然後遇到了執行緒池,使用執行緒池對矩陣運算進行加速。

執行緒池(thread pool):一種執行緒使用模式。多執行緒程式設計中,執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池維護著多個執行緒,等待管理者分配可併發執行的任務。這避免了在處理短時間任務時建立與銷毀執行緒的代價。執行緒池不僅能夠保證核心的充分利用,還能防止過分排程。可用執行緒數量應該取決於可用的併發處理器、處理器核心、記憶體、網路sockets等的數量。 例如,執行緒數一般取cpu數量+2比較合適,執行緒數過多會導致額外的執行緒切換開銷。

執行緒池模式一般分為兩種:hs/ha半同步/半非同步模式、l/f領導者與跟隨者模式。

這裡只討論半同步/半非同步模式執行緒池。

迴圈佇列實現檔案,使用互斥量來實現執行緒的讀寫安全。

ring_buffer.h

#ifndef ringbuffer_h_

#define ringbuffer_h_

#include class ring_buffer ;

#endif

ring_buffer.cpp

#include "ring_buffer.h"

#include ring_buffer::ring_buffer (int size)

m_buffer = new void*[m_size];

pthread_mutex_init (&m_dequeue_lock, null);

pthread_mutex_init (&m_enqueue_lock, null);

m_dequeue_ptr = 0;

m_enqueue_ptr = 0;

}int ring_buffer::is_empty ()

return 0;

}int ring_buffer::is_full ()

return 0;

}int ring_buffer::get_element (void** data) else

}int ring_buffer::add_element (void* data) else

}ring_buffer::~ring_buffer ()

執行緒池實現檔案,使用了單例模式。

thread_pool.h

#ifndef thread_pool_h_

#define thread_pool_h_

#include "ring_buffer.h"

#include #include class task ;

void *get_task (void *arg);

class thread_pool ;

#endif

thread_pool.cpp

#include "thread_pool.h"

#include #include using namespace std;

atomic_int m_finish_counter;

/*thread func*/

void *get_task (void *arg)

}}thread_pool::thread_pool ()

m_workers = new pthread_t[m_worker_num];

for (int i = 0; i < m_worker_num; ++i)

}//單例模式

這裡由於m_size是2的n次方,那麼m_size-1的二進位制形式就肯定是000...11111這種形式(第0到n-1位都是1,前面都是0),假設n為3,那麼m_size=8,m_size-1=7m_size-1的二進位制是011(m_enqueue_ptr + 1) & (m_size - 1)的作用和(m_enqueue_ptr + 1) % (m_size)一樣,之所以這樣寫,可能是為了加速?

10分鐘帶你看懂氣泡排序Yu選擇排序

你可以這樣理解 從小到大排序 存在10個不同大小的氣泡,由底至上地把較少的氣泡逐步地向上公升,這樣經過遍歷一次後,最小的氣泡就會被上公升到頂 下標為0 然後再從底至上地這樣公升,迴圈直至十個氣泡大小有序。在氣泡排序中,最重要的思想是兩兩比較,將兩者較少的公升上去 問題 設有一陣列,其大小為10個元素...

python迴圈總被繞暈?帶你10分鐘夯實基礎!!

一 程式的分支結構 1.單分支結構 if語句 2.二分支結構 if else語句 3.多分支結構 if elif else語句 4.結構的巢狀 巢狀分支 例題 使用巢狀選擇結構將成績從百分制變換到等級制 score int input 請輸入成績 0 100 degree dcbaae if sco...

10分鐘帶你了解資料分析市場變化趨勢

bi和分析平台市場從it主導的報告轉向現代業務主導的分析已經成為主流,bi解決方案的發展和演變非常迅速,資料分析市場的變化趨勢又該如何?tempo大資料分析平台 根據自己的行業經驗以及對權威報告的解讀,總結出一些要點,在此分享給大家。1 自然語言處理將在bi市場扮演重要角色 2 人工智慧助理資料分析...