nginx原始碼之重寫共享記憶體鎖類

2021-12-30 02:15:10 字數 2414 閱讀 9828

先貼**,細節以後有必要再加。

mytool_lock_base.h:

#ifndef mytool_lock_base_h

#define mytool_locks_base_h

#include

#include

#include

namespace mytool

//__sync_fetch_and_add,buitin函式,value+add並賦值回value,返回value舊值

//關鍵彙編指令為lock addq

//nginx僅僅只需要增加值

inline atomic_t atomic_fetch_add(atomic_t *pvalue,atomic_t add)

//nginx更新時間字串時會用到

//能否inline?

#define mytool_memory_barrier() __sync_synchronize()

//當前單執行緒的nginx主流程實際只用到的兩個加鎖函式,加鎖失敗,立即返回,不強求

//單執行緒只需給訊號處理函式和正常流程衝突部分加鎖,如果用下面的自旋鎖(同時也實現了互斥鎖)函式加鎖,會引起死鎖

inline bool trylock(atomic_t *plock)

inline void unlock(atomic_t *plock)

//扒自ngx_spinlock,實際功效和名字不同,根據引數和環境的不同,可以體現為自旋鎖、互斥鎖或二者結合形式

//nginx本函式沒有實際使用場景,但是類似**在ngx_shmtx.c內有

#define mytool_cpu_pause() __asm__ ("pause")

inline void spinlock(atomic_t *lock,atomic_t value,unsigned spin)

}sched_yield();

}}}#endif

mytool_shmlock.h

#ifndef mytool_shmlock_h

#define mytool_shmlock_h

#include "mytool_lock_base.h"

//nginx**內實現了多種形式的互斥,原子操作trylock、自旋鎖、訊號量、互斥鎖,但是當前nginx的單執行緒多路復用模式使得工作程序掛起於某種事件不能接收。所以實際上使用的也就是trylock,得不到就放手。

//程序間的互斥用原子操作trylock+共享記憶體實現,也是接下來要試圖扒取的

//認為會作為全域性變數使用,沒有收回記憶體

namespace mytool

//可以加當前lock的持有者pid,unlock時驗證,todo

inline void unlock() noexcept(true)

static shmlock *getnewshmlock() noexcept(false);

private:

static key_t _smid;

static shmlock *_shm;

static unsigned _idcount;

const static unsigned _maxnid = 20;

shmlock():lock(0) {}

atomic_t lock;};}

#endif

mytool_shmlock.cpp

#include "mytool_shmlock.h"

#include

#include

#include

#include

namespace mytool

if(_idcount >= _maxnid)

throw std::overflow_error("too many shmlock built");

//shmlock::shmlock(_shm + _idcount);

new (_shm + _idcount) shmlock;

return _shm + _idcount++;

}}最後的測試cpp:#include "mytool_shmlock.h"

#include

#include

using namespace mytool;

int main()

else

return 0;

}sleep(1);

if(psm->trylock())

printf("parent got lock\n");

else

return 0;

}輸出:son got lock

parent failed to get lock

son releaed lock

parent finally got the lock

符合預期。

C 共享記憶體例項 附原始碼

原文 c 共享記憶體例項 附原始碼 網上有c 共享記憶體類,不過功能太簡單了,並且寫記憶體每次都從開頭寫。故對此進行了改進,並做了個小例子,供需要的人參考。主要改進點 通過利用共享記憶體的一部分空間 以下稱為 資料資訊區 來儲存當前記憶體中儲存的資料資訊 count和length或者新增其他資訊 完...

共享記憶體操作類 C 原始碼

vc 的共享記憶體操作 實現起來相對比較容易,但是用c 語言來實現,就有一定難度,由於工作需要,把以前vc開發的共享記憶體 要用c 實現,別說,還費了不少周折,畢竟c 操作api函式和位址指標不是那麼直接,還好,總算完成了,效果還不錯。共享記憶體操作類 using system using syst...

bind原始碼重寫

前言 在了解怎麼實現bind之前我們先來了解一下bind的功能,正所謂知己知彼百戰不殆。原生bind的功能 bind的功能主要用來強制繫結函式的this,然後返回乙個新的函式 function show args var obj var newshow0 show.bind var newshow1...