最近在學習go語言,基本語法熟悉以後,想看一些開源項目,因而就找到了NSQ,在看NSQ源碼的時候,對signal進行了閱讀,一下內容僅供參考。
- 圖中能夠看到信號來一共是62個,32和33沒有
- 非實時信號都不支持排隊,都是不可靠信號;實時信號都支持排隊,都是可靠信號。
- 1到31號都是不可靠信號
type handler struct { mask [(numSig + 31) / 32]uint32 } func (h *handler) want(sig int) bool { return (h.mask[sig/32]>>uint(sig&31))&1 != 0 } func (h *handler) set(sig int) { h.mask[sig/32] |= 1 << uint(sig&31) } func (h *handler) clear(sig int) { h.mask[sig/32] &^= 1 << uint(sig&31) }
- type handler struct :定義了處理信號量的數據結構,mask [(numSig + 31) / 32]uint32中numSig是65,因此就是一個2個元素的數組,元素類型是uint32位的,4字節
- set函數中,mask數組的初始化都是0,uint(sig&31)是整數截取後5位,左移一位是由於信號量是從1開始的。所以運算完以後,前31個信號量存放在mask數組的第一個元素中,這個4字節的元素能夠表示成32位的二進制,0000,0000,0000,0000,0000,0000,0000,0000,從後往前,編號從0到31,若是信號量是1,則編號爲1的位置置1。就像是有32個桶,每一個桶都有一個編號,從0到31,若是有這個信號量的值,就在桶裏放滿水。
- want函數是判斷給定的整數,是否是這個62個信號量。
- clear 利用&^,將對應位置清零
go語言這種處理方式閱讀起來仍是挺巧妙的,以前看得時候也是弄明白,如今記下來,但願能提供一點用處。linux
- linux信號量的知識儲備不全,先獲取了linux信號量的知識以後才搞明白爲何這麼寫的。
- 源碼這種事情,仍是能夠單獨拿出來,針對看不懂的地方進行調試,快速的瞭解。