初識Linux · 線程互斥

前言:

本文的主題是線程互斥,但是我們不能光單獨的把概念引出來,我們肯定要一個場景,所以我們將搶票這個場景引出來,模擬一下搶票的場景,隨即引出今天的主題。

那么對于線程互斥這個主題,我們從以下幾點介紹:

認識鎖和它的接口->解決歷史問題->原理角度理解鎖->實現角度理解鎖。

當然了,因為沒有理解搶票這個場景,所以我們暫時不知道鎖是什么是正常的,那么,直接進入主題吧!


場景->搶票

搶票的基本邏輯是多個線程一起搶,所以我們需要創建多線程,多線程創建好了之后,都執行同一個函數,即搶票函數。

同時,我們將票的數量固定到只有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,循環結束,整個代碼完美結束。

不過……?

初識Linux · 線程互斥

搶到了負數?

搶到了相同的票?

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享