C 11 半同步半非同步執行緒池的實現

2022-02-26 15:42:55 字數 2407 閱讀 2542

#include #include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

namespace

itstation

void put(const t&x)

void put(t&&x)

void take(list&list)

);if(m_needstop)

return

; list =move(m_queue);

m_notfull.notify_one();

}void take(t&t)

);if(m_needstop)

return

; t =m_queue.front();

m_queue.pop_front();

m_notfull.notify_one();

}void

stop()

m_notfull.notify_all();

//將所有等待的執行緒全部喚醒,被喚醒的程序檢查m_needstop,為真,所有的執行緒退出執行

m_notempty.notify_all();

}private

:

bool notfull() const

bool notempty() const

template

void add(f&&x)

); //

沒有停止且滿了,就釋放m_mutex並waiting;有乙個為真就繼續執行

if(m_needstop)

return

; m_queue.push_back(forward

(x));

m_notempty.notify_one();

}private

: list

m_queue; //

緩衝區 mutex m_mutex; //

互斥量 condition_variable m_notempty; //

條件變數

condition_variable m_notfull;

int m_maxsize; //

同步佇列最大的size

bool m_needstop; //

停止標識

};

const

int maxtaskcount = 100

;

class

threadpool

virtual ~threadpool()

void

stop());}

void addtask(task&&task)

void addtask(const task&task)

private

:

void start(int

numthreads)

}//每個執行緒都執行這個函式

void

runinthread()}}

void

stopthreadgroup()

m_threadgroup.clear();

}private

: list

> m_threadgroup; //

處理任務的執行緒組, 鍊錶中儲存著指向執行緒的共享指標

synaqueuem_queue; //

同步佇列

atomic_bool m_running; //

是否停止的標識

once_flag m_flag;

};} //

namespace itstation

#include

#include

#include

"objectpool.h

"#include

using

namespace

std;

using

namespace

itstation;

void

testthreadpool()

); }

});thread thd2([&pool]);

}});

this_thread::sleep_for(chrono::seconds(

45));

pool.stop();

thd1.join();

thd2.join();

}int

main()

c 11 實現半同步半非同步執行緒池

隨著深入學習,現代c 給我帶來越來越多的驚喜 c 真的變強大了。事實上非常好理解。分為三層 同步層 通過io復用或者其它多執行緒多程序等不斷的將待處理事件加入到佇列中。這個過程是同步進行的。佇列層 全部待處理事件都會放到這裡。補充下思路 主要是後兩層 佇列層 c 11 通過std function能...

c 11實現乙個半同步半非同步執行緒池

在處理大量併發任務的時候,如果按照傳統的方式,乙個請求乙個執行緒來處理請求任務,大量的執行緒建立和銷毀將消耗過多的系統資源,還增加了執行緒上下文切換的開銷,而通過執行緒池技術就可以很好的解決這些問題,執行緒池技術通過在系統中預先建立一定數量的執行緒,當任務請求到來時從執行緒池中分配乙個預先建立的執行...

半同步半非同步 多程序 多執行緒 區別

在 linux高效能伺服器程式設計 中,看到的最厲害的方法基本上就是這個半同步半非同步的方法了。簡直炸天。用到了多程序 多執行緒 epoll i o復用。好像真的很高效能哦。那麼其中多程序和多執行緒的的區別是啥?為了避免在父 子程序之間傳遞檔案描述符,我們將接受新連線的操作放到子程序中。前文的討論,...