熱線電話:0755-23712116
郵箱(xiang):contact@legoupos.cn
地址:深圳市寶安區沙井街(jie)道(dao)后亭(ting)茅洲山工業園工業大(da)廈全(quan)至科(ke)技創新園科(ke)創大(da)廈2層2A
0 前言(yan)
1 消費者“被動(dong)等待”
#include
#include
#include
static std::mutex mtx;
static std::deque<int> dq;
static int productNum = 5;
void Producer()
{
using namespace std::literals::chrono_literals;
for (int i = 1; i <= productNum; ++i) {
mtx.lock();
dq.push_front(i);
std::cout << "Producer 生(sheng)產(chan)產(chan)品為: " << i << std::endl;
mtx.unlock();
// std::this_thread::sleep_for(1s);
}
}
void Consumer()
{
while (true) {
if (dq.empty()) {
continue;
}
mtx.lock();
int data = dq.back();
dq.pop_back();
std::cout << "Consumer 消費產品為: " << data << std::endl;
mtx.unlock();
}
}
int main()
{
std::thread t1(Producer);
std::thread t2(Consumer);
t2.join();
t1.join();
std::cin.get();
}
程序運行結果如下:
如果讓生產(chan)者(zhe)線程(cheng)每(mei)生產(chan)一個產(chan)品后休(xiu)息(sleep) 1s,結果如下:
解(jie)釋(shi):該例(li)子中(zhong),生產(chan)者(zhe)和(he)消費者(zhe)分別對應兩個(ge)線程。隊(dui)列中(zhong)存在物(wu)品時(shi),消費者(zhe)去消費,否則(ze)空循(xun)環,一直等待。
缺點(dian):當雙端隊列中(zhong)沒有物品時,消(xiao)費者只會原地死等,不會去(qu)催。
2 消(xiao)費者“主(zhu)動出擊”
#include
#include
#include
#include
#include
std::mutex mtx;
std::condition_variable cv;
std::vector<int> vec;
int productNum = 5;
void Producer()
{
for (int i = 1; i <= productNum; ++i) {
std::unique_lock<std::mutex> lock(mtx);
while (!vec.empty()) {
cv.wait(lock); // vec 不為(wei)空時(shi)阻塞當前線程
}
vec.push_back(i);
std::cout << "Producer生產(chan)(chan)產(chan)(chan)品(pin): " << i << std::endl;
cv.notify_all(); // 釋放線程(cheng)鎖
}
}
void Consumer()
{
while (true) {
std::unique_lock<std::mutex> lock(mtx);
while (vec.empty()) {
cv.wait(lock); // vec 為空時(shi)(shi)等待線(xian)程(cheng)鎖。其他線(xian)程(cheng)鎖釋放時(shi)(shi),當前線(xian)程(cheng)繼續執(zhi)行
}
int data = vec.back();
vec.pop_back();
std::cout << "Consumer消費產品: " << data << std::endl;
cv.notify_all();
}
}
int main()
{
std::thread t1(Producer);
std::thread t2(Consumer);
t2.join();
t1.join();
std::cin.get();
}
程序運行結果如下:
解釋:該例子中,生產者和消費者分別對應兩個線程。只要 vector 中存在物(wu)品(pin)時,生產(chan)(chan)者線(xian)程(cheng)(cheng)就(jiu)阻(zu)塞(sai),通知消費者線(xian)程(cheng)(cheng)去消費;vector 中不存在物(wu)品(pin)時,消費者線(xian)程(cheng)(cheng)阻(zu)塞(sai),通知生產(chan)(chan)者去生產(chan)(chan)。
3 線程(cheng)加入方式 join 和 detach
join:采(cai)用 join 方式(shi),t1、t2 亂序執行(xing),且外層主線程會等(deng)到(dao) t1、t2 都(dou)結束了再繼續執行(xing)后(hou)面的代碼。
detach:如(ru)果采用(yong) detach 方式,t1、t2 亂(luan)序(xu)執(zhi)行,且脫離(li)了外層主線程(cheng)(cheng)。外層主線程(cheng)(cheng)執(zhi)行結束時,t1、t2 可能還沒結束,但此時程(cheng)(cheng)序(xu)就退出了。
如涉及侵權(quan),請相關權(quan)利人與我司聯系刪除