1. 程式人生 > >GCD之訊號量機制一

GCD之訊號量機制一

在使用NSOperationQueue進行多執行緒程式設計時,可通過[queue setMaxConcurrentOperationCount:5]來設定執行緒池中最多並行的執行緒數,在GCD中訊號量機制也和它相似,可以控制併發的執行緒數量。

1.首先熟悉下幾個函式

dispatch_semaphore_create 建立一個訊號量,設定一個初始值
dispatch_semaphore_signal 傳送一個訊號,訊號通知,訊號量+1
dispatch_semaphore_wait 等待訊號,訊號量-1

當一個訊號量被通知 ,訊號量就會加1,當一個訊號等待,訊號總量就減1,當減到訊號量小於0時,執行緒會被阻塞,訊號量不會在減了。直到訊號量大於0時,執行緒會再次啟動執行

下面參考http://blog.sina.cn/dpool/blog/s/blog_ac94a55f0101pa4l.html建了一個初始值為10的訊號量

1 2 3 4 5 6 7 8 9 10 11 12 13 dispatch_group_t group=dispatch_group_create(); dispatch_semaphore_t semaphore=dispatch_semaphore_create(10); dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i=0; i<100; i++) { //訊號量減1,如果同時開啟10個以上的執行緒,則訊號量小於等於0,此時就會阻塞該執行緒。 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_group_async(group, queue, ^{ NSLog(@"test %d",i); //每個執行緒執行減1後通過訊號量通知加1,這樣始終保持執行緒在10個之內 dispatch_semaphore_signal(semaphore); }); } dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

 執行結果:

上面的例子可能效果不太明顯,現在設定訊號量初始值為1,看下 面程式碼段:

1 2 3 4 5 6 7 8 9 10 11 12 13 dispatch_group_t group=dispatch_group_create(); dispatch_semaphore_t semaphore=dispatch_semaphore_create(1); dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); for (int i=0; i<100; i++) { //訊號量減1,如果同時開啟10個以上的執行緒,則訊號量小於等於0,此時就會阻塞該執行緒。 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_group_async(group, queue, ^{ NSLog(@"test %d",i); //每個執行緒執行減1後通過訊號量通知加1,這樣始終保持執行緒在10個之內 dispatch_semaphore_signal(semaphore); }); } dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

 執行結果:

初始值設為1時,相當於是序列佇列,單執行緒執行。

相關推薦

GCD訊號機制

在使用NSOperationQueue進行多執行緒程式設計時,可通過[queue setMaxConcurrentOperationCount:5]來設定執行緒池中最多並行的執行緒數,在GCD中訊號量機制也和它相似,可以控制併發的執行緒數量。 1.首先熟悉下幾個函式

ios GCD訊號機制

一,什麼是訊號量機制    抽象說:     訊號量是一個整型值並且具有一個初始計數值,並且支援兩個操作:訊號通知和等待。當一個訊號量被訊號通知,其計數會被增加。當一個執行緒在一個訊號量上等待時,假如此時的訊號量的整型值為0, 執行緒會被阻塞(因為等待會讓訊號量的整型

程序間通訊——訊號)(system V)

system v訊號量又被稱為system v訊號量集。它的本質就是一個計數器,用來為多個程序共享的資料結構提供受控訪問。訊號量支援的操作有:使用最廣泛的訊號量為二元訊號量,它控制單個資源,對於這種訊號量而言,它只有兩種合法值: 0 和 1 ,對應一個可用的資源。若當前有資源

Linux核心同步機制訊號和互斥體

訊號量:訊號量(semaphore)是程序間通訊處理同步互斥的機制。是在多執行緒環境下使用的一種措施,它負責協調各個程序,以保證他們能夠正確、合理的使用公共資源。 它和spin lock最大的不同之處就是:無法獲取訊號量的程序可以睡眠,因此會導致系統排程。原理訊號量一般可以用

linux下多執行緒同步機制訊號、互斥、讀寫鎖、條件變數

之前有寫過類似的部落格,這東西不用老忘,現在又有更清晰的理解了。 一、訊號量 編譯時候加入-lrt 訊號量最基本的兩個操作就是PV操作:P()操作實現訊號量減少,V()操作實現訊號量的增加 訊號量的值取決於訊號量的型別,訊號量的型別有多種: (1)二進位制訊號量:0與1.

iOS系統GCD學習(5):訊號機制

當我們在處理一系列執行緒的時候,當數量達到一定量,在以前我們可能會選擇使用NSOperationQueue來處理併發控制,但如何在GCD中快速的控制併發呢?答案就是dispatch_semaphore,對經常做unix開發的人來講,我所介紹的內容可能就顯得非常入門級了,訊

linux同步機制訊號down 和up

訊號量(semaphore)   Linux核心的訊號量在概念和原理上和使用者態的System V的IPC機制訊號量是相同的,不過他絕不可能在核心之外使用,因此他和System V的IPC機制訊號量毫不相干。   訊號量在建立時需要設定一個初始值,表示同時能有幾個任務能訪問

linux 多執行緒訊號 sem_init

1. 什麼是訊號量 linux sem 訊號量是一種特殊的變數,訪問具有原子性, 用於解決程序或執行緒間共享資源引發的同步問題。 使用者態程序對 sem 訊號量可以有以下兩種操作: 等待訊號量 當訊號量值為 0 時,程式等待;當訊號量值大於 0 時,訊號量減 1,程式

【OS】訊號機制

儲存一下自己看,侵刪。 原文地址:http://blog.csdn.net/speedme/article/details/17597373 上篇部落格中(程序同步之臨界區域問題及Peterson演算法),我們對臨界區,臨界資源,鎖機制詳細解讀了下,留下了一個問題,就是鎖機制只能判斷臨界資源是否被佔用,所

訊號機制中的down和up函式

轉自:https://blog.csdn.net/fzubbsc/article/details/37737159 參考: https://blog.csdn.net/liuxd3000/article/details/17913363 http://blog.chinaunix.net

第二章 2.3 訊號機制

整形訊號量: 訊號量定義為一個整型量; 根據初始情況賦相應的值; 僅能通過兩個原子操作來訪問 P 操作: wait(S): While S<=0 do no-op; S:=S-1;

Linux訊號

訊號量概念 Dijkstra提出的“訊號量”概念是共發程式設計領域的一項重大進步 訊號量是一種變數,它只能取正整數值,對這些正整數只能進行兩種操作:等待和訊號 用兩種記號來表示訊號量的這兩種操作:     P(semaphore variable) 代表等待     V(s

4.IPC訊號 //依據RT-Thread核心程式設計的學習記錄(非核心實現)

IPC: Inter proess communication   大的任務中的各任務資訊互動配合,內容包括訊號量,互斥鎖,訊號,訊息佇列,郵箱     本篇文章,只討論第一個內容,訊號量 1.訊號量的建立 和執行緒的建立方式類似,訊號量的建立也分動態dynamic和靜態

計算機作業系統感悟隨筆--訊號機制

2.訊號量的基本應用 實現程序互斥 實現程序間的前趨關係(有序) 3.整型訊號量 把整型訊號量定義為一個表示資源數目的整型量S,除初始化外,僅能通過兩個標準的原子操作wait(S)和signal(S)來訪問。 wait(S)和signal(S)操作可以描述為

Python並行程式設計(五):執行緒同步訊號

1、基本概念       訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是一個內部資料,用於標明當前的共享資源可以有多少併發讀取。       同樣在threading中,訊號量有acquire和release兩個函式。       - 每當執行緒想要讀取關聯

linux程序控制訊號 semget,semctl,semop

轉載自 https://www.cnblogs.com/52php/p/5851570.html 這篇文章將講述別一種程序間通訊的機制——訊號量。注意請不要把它與之前所說的訊號混淆起來,訊號與訊號量是不同的兩種事物。有關訊號的更多內容,可以閱讀我的另一篇文章:L

Alios things學習訊號與互斥

Sem訊號量  1. 概念 任務可以通過獲取訊號量來獲取訪問共享資源的“門禁”,可以通過配置訊號量數目,讓多個任務同時獲取門禁,當無法獲取時,任務會按照優先順序排隊獲取“門禁”,缺點是存在優先順序翻轉問題。  2. sem操作      1)靜態建立:kstat

Java執行緒訊號

 計數訊號量用來控制同時訪問某個特定資源的運算元量,或者同時執行某個指定操作的數量。計數訊號量還可以用來實現某種資源池,或者對容器施加邊界。  Semaphore中管理者一組虛擬的許可,許可的數量可通過建構函式來指定。在互相操作時可以首先獲得許可(只要還有剩餘的許可),並在使用以後釋放許可。

哲學家就餐問題——and型訊號機制

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <stdbool.h> #includ

多執行緒訊號Semaphore及原理

一、訊號量(Semaphore) 重入鎖ReentrantLock是獨佔模式,一次都只允許一個執行緒訪問一個資源,而訊號量是共享模式,也就是說可以指定多個執行緒,同時訪問某一個資源。 Semaphore的兩個構造方法: public Semaphore(int pe