線程同步

舉例場景

例子:

  • 重慶售票窗、上海售票窗都在賣一趟飛機票
  • 問題,出現兩個售票窗同一時刻賣一張票
  • 這肯定是不合理,下面說解決方式

解決方式

線程鎖,我們專業點,嗯線程同步

GCD Semaphore (信號量)

示例代碼

//"最後一張票,不騙你"
    __block NSInteger planeTicketCount = 1;

    // 創建線程鎖 信號=1
    dispatch_semaphore_t semaphore = hSemaphore(1);
    while (1) {

        if (planeTicketCount == 0) break;

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
            // 信號遞減 == 0 就上鎖 線程一直在這裏等待 ,後面一個參數是等待時間
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

            if (planeTicketCount > 0) {
                // 賣掉了
                planeTicketCount --;
            }

            // 信號遞增 不等0 則喚醒還在等待此信號的線程
            dispatch_semaphore_signal(semaphore);

        });
    }

NSLock (鎖)

//"最後一張票,不騙你"
    __block NSInteger planeTicketCount = 1;

    // 買了一把鎖
    NSLock *Lock = [[NSLock alloc]init];

    while (1) {
        if (planeTicketCount == 0)break;

        [[hGCD globalQueue]queueBlock:^{
            // 鎖上,不讓其他線程過去了
            [Lock lock];

            if (planeTicketCount >0 ) {
                planeTicketCount --;
            }

            // 解鎖,其他線程可以進入此代碼段了
            [Lock unlock];

        }];
    }

@synchronized (self) 顧名思義同步

//"最後一張票,不騙你"
    __block NSInteger planeTicketCount = 1;

    while (1) {
        if (planeTicketCount == 0)break;

        [[hGCD globalQueue]queueBlock:^{

            // 括起來的這一段代碼 同一時間只能有一個線程執行
            @synchronized (self) {

                if (planeTicketCount >0 ) {
                    planeTicketCount --;
                }


                //代碼端執行完了,自動放鎖
            }

        }];
    }
發佈了50 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章