#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復用。好像真的很高效能哦。那麼其中多程序和多執行緒的的區別是啥?為了避免在父 子程序之間傳遞檔案描述符,我們將接受新連線的操作放到子程序中。前文的討論,...