前言:
本文的主題是線程互斥,但是我們不能光單獨的把概念引出來,我們肯定要一個場景,所以我們將搶票這個場景引出來,模擬一下搶票的場景,隨即引出今天的主題。
那么對于線程互斥這個主題,我們從以下幾點介紹:
認識鎖和它的接口->解決歷史問題->原理角度理解鎖->實現角度理解鎖。
當然了,因為沒有理解搶票這個場景,所以我們暫時不知道鎖是什么是正常的,那么,直接進入主題吧!
場景->搶票
搶票的基本邏輯是多個線程一起搶,所以我們需要創建多線程,多線程創建好了之后,都執行同一個函數,即搶票函數。
同時,我們將票的數量固定到只有10000張,讓4個線程在規定時間之內搶票,因為cpu里面存在時間片的概念,所以我們不妨設置一個死循環,一個線程在規定時間之內能搶多少就搶多少。
基本邏輯我們已經捋順了,現在直接實現吧!
代碼語言:JavaScript代碼運行次數:0運行復制
int tickets = 10000;void Rounte(const std::string& name){ while(true) { if(tickets > 0) { usleep(1000); printf("who: %s, get a ticket: %dn", name.c_str(), tickets); tickets--; } else { break; } }}int main(){ Thread t1("thread -1", Rounte); Thread t2("thread -2", Rounte); Thread t3("thread -3", Rounte); Thread t4("thread -4", Rounte); t1.Start(); t2.Start(); t3.Start(); t4.Start(); t1.Join(); t2.Join(); t3.Join(); t4.Join(); return 0;}
當然了,使用的線程是我們自己實現的線程,使用起來還是比較絲滑的。
那么我們認為的現象應該是最后tickets到了0,循環結束,整個代碼完美結束。
不過……?

搶到了負數?
搶到了相同的票?
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END