C 實現執行緒池 條件變數

2021-09-28 11:11:15 字數 3768 閱讀 9964

因為多執行緒對於cpu的高效利用 好幾種高效能的伺服器框架都使用了多執行緒 但執行緒的建立和**是非常浪費系統資源的 常常會有不必要的時間損失 但我們的伺服器的硬體確相對來說非常充裕 於是我們可以初始化一組資源 在伺服器執行階段可以直接獲取而不需要重新分配 相對的在乙個邏輯單元執行完以後也不需要釋放資源 從而大大提高了效率 避免了對核心的頻繁訪問 這裡我們說的資源就是執行緒 初始化的這一組資源可以看做是乙個執行緒池

執行緒池基本原理threadpool.h

#ifndef threadpool_h_

#define threadpool_h_

#include

"locker.h"

#include

#include

#include

#include

#include

template

<

typename t>

void

solve

(const t &t)

template

<

typename t>

class

threadpool

;public

:explicit

threadpool

(int thread_number = max_thread,

int max_requests = max_requests);~

threadpool()

;bool

(t* request)

;//向任務佇列中新增任務

private

:static

void

*worker

(void

*arg)

;void

run();

private

:int m_thread_number;

//最大執行緒數

int m_max_requests;

//最大請求數

pthread_t* m_threads;

//描述執行緒的陣列

//unique_ptrm_threads; //如果確定陣列大小 就可以用unique_ptr管理記憶體

std::list> m_workqueue;

//任務佇列

cond m_queuestate;

//條件變數 類內初始化 

bool m_stop;

//直接類內預設初始化失敗};

template

<

typename t>

threadpool

::threadpool

(int thread_number,

int max_requests)

:m_thread_number

(thread_number)

,m_max_requests

(max_requests)

,m_stop

(false),

m_threads

(null),

m_queuestate()

m_threads =

new pthread_t[m_thread_number];if

(!m_threads)

//typedef void* (*temp)(void*);

using temp =

void*(

*)(void*)

; temp enp =

(temp)

&threadpool::run;

for(

int i=

0;i++i)if(

int ret =

pthread_detach

(m_threads[i]))

}}template

<

typename t>

threadpool::~

threadpool()

template

<

typename t>

bool threadpool

::(t* requests)

m_workqueue.

emplace_back

(requests)

; m_queuestate.

signal()

; m_queuestate.

unlock()

;return

true;}

template

<

typename t>

//這個函式本來為pthread_create的引數準備的 但有更好的解決方案 及強制型別轉換

void

* threadpool

::worker

(void

*arg)

template

<

typename t>

void threadpool

::run()

t* request = m_workqueue.

front()

; m_workqueue.

pop_front()

; m_queuestate.

unlock()

;//這裡就是執行緒得到這個引數後如何執行

std::cout <<

pthread_self()

<< std::endl;

solve

(*request);}

}#endif

locker.h

#ifndef locker_h_

#define locker_h_

#include

#include

#include

//訊號量

class

locker}~

locker()

bool

lock()

bool

unlock()

private

: pthread_mutex_t m_mutex;};

class

condif(

pthread_cond_init

(&m_cond,

nullptr)!=

0)}~

cond()

bool

signal()

bool

wait()

bool

lock()

bool

unlock()

private

: pthread_mutex_t m_mutex;

pthread_cond_t m_cond;};

#endif

test_for_threadpool.cpp

#include

"threadpool.h"

#include

#include

using

namespace std;

int flag,tmp;

intmain()

;//加while的原因是把超過最大請求的重新傳送

//sleep(2);

}return0;

}

linux c 執行緒池 互斥變數 條件變數

執行緒池主要實現模組multithreadtest.c include include include include include include typedef struct threadworker typedef struct threadpool static struct thread...

c 執行緒條件變數

此處有兩個執行緒,乙個作為生產者,把資料放入佇列中,乙個作為消費者,把資料從佇列中取出,所以對兩個執行緒而言,這個佇列是共用的,所以要加鎖進行保護。include stdafx.h include include include include include using namespace std...

條件變數實現執行緒同步

1 什麼是條件變數實現執行緒同步?假如我們的程式中有兩個執行緒,乙個是生產者執行緒,另乙個是消費者執行緒,生產者執行緒每隔一段時間把資料寫入到緩衝區buffer中,而消費者執行緒則每隔一段時間從buffer中取出資料,為了避免兩個執行緒讀寫混亂,我們讓生產線執行緒寫完後再通知消費者來讀資料,那麼則可...