先貼**,細節以後有必要再加。
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...