共享記憶體中不能儲存 類中有申請空間的類物件

2021-10-01 20:05:40 字數 3634 閱讀 7054

有乙個需求,作為客戶端需要從redis集群中獲取資料。出於效能的考慮,再客戶端初始化階段,初始化了乙個redis連線,後續在連線redis時,可以直接使用該連線,不用再去重新連線redis了。(這裡指的連線其實就是初始化乙個類物件,然後根據ip+prot連線redis集群)

但是這樣的操作有乙個問題就是,當有多個客戶端連線redis集群時,由於連線數過多,達到redis節點連線數的限制(預設是4096個連線),這裡雖然可以修改redis節點連線數的限制,但是還是沒有從源頭解決問題,當併發達到一定程度,仍然可以達到連線的上限。

看到這裡想著是否可以使用連線池,但是我這種情況不適用。

在真正需要從redis中獲取資料時,建立連線->執行操作->釋放連線,這樣確實可以控制住連線數,但是對效能影響較大。

是否可以將redis連線(乙個類物件)放在共享記憶體中,多個程序共用乙個連線,這樣就可以將連線數控制住,而且對效能也沒有影響。

在網上找了linux中共享記憶體的例子,改寫了下

共享記憶體使用,參考:linux程序間通訊——使用共享記憶體

我想在共享記憶體中放一些基本型別和複雜的型別(string vector 只要有申請空間的操作就行),看下通過共享記憶體訪問這些複雜的變數是否可以行的通。

#ifndef _shmdata_h_header

#define _shmdata_h_header

#include

#define text_sz 2048

class

aconst

char

*printlog()

void setsss (

const

char

*s)int

getnum()

const

char

*getstr()

int num;

const

char

* str;

std::string str_string;};

struct shared_use_st ;

#endif

從共享記憶體中讀取a類中的變數,檢視多程序下是否是基本型別可以獲取,而複雜型別不能獲取

資料操作檔案 shmwrite.cpp

簡單描述下,該檔案中有

int initconnect()

int get()

pid_t fork_children(int num)

這幾個函式,其中initconnect用來初始化共享記憶體。get從共享記憶體中獲取資料。fork_children建立多個程序

程式是由主程序呼叫initconnect來初始化共享記憶體,然後建立3個子程序從共享記憶體中獲取資料(這裡沒有考慮同步的問題,先看是否可以正常訪問)。程式流程是這樣的,可以看下下文中的執行結果和程式中最長的那句注釋。

#include

#include

#include

#include

#include

#include

"shmdata.h"

#include

using

namespace std;

a *p=

null

;int

initconnect()

//將共享記憶體連線到當前程序的位址空間

shm =

shmat

(shmid,

(void*)

0,0)

;if(shm ==

(void*)

-1)printf

("memory attached at %x\n"

, shm)

;//設定共享記憶體

shared =

(struct shared_use_st*

)shm;

printf

("shared->written = %d\n"

,shared-

>written)

;//向共享記憶體中寫入資料

strncpy

(shared-

>text, buffer, text_sz)

; shared-

>written =1;

p =new(shared)a(

"cx");

printf

("if share memery is %s\n"

,shared-

>text)

; cout<<

"init success"

"p->num = "

<>num<<

" p->str = "

<>str

>str_string=

"changxin";}

return-1

;}intget()

//將共享記憶體連線到當前程序的位址空間

shm =

shmat

(shmid,

(void*)

0,0)

;if(shm ==

(void*)

-1)printf

("\n\nmemory attached at %x\n"

, shm)

;//設定共享記憶體

shared =

(struct shared_use_st*

)shm;

p =&(shared-

>a)

; cout<<

"get shared->text = "

<>text

("p = %x\n"

,p);

printf

("p_num = %d\n"

,p->

getnum()

);printf

("p_str= %s\n"

,p->

getstr()

);cout<<

"get p->num = "

<>num<<

" p->str = "

<>str

"get shared->writtten = "

<>written

//因為string的內部實現是自己建立的空間,而建立的這個空間只對當前程序有效,對其他程序不是不可用的。

cout<<

"get p->str_string = "

<>str_string

shmdt

(shm)==-

1)}//建立num個程序

pid_t fork_children

(int num)

return1;

}int

main()

//子程序操作

else

if(pid ==0)

return1;

}

編譯

g++ shmwrite.cpp -o shmwrite -lm

執行結果

C 函式中,兩個自動釋放記憶體的動態記憶體申請類

最近做乙個事情,實現乙個流程互動,其中主互動流程函式中,涉及較多的記憶體申請,而健康的函式,都是在函式退出前將手動申請不再需要的記憶體釋放掉,使用很多方法,都避免不了較多的出錯分支時,一堆的if free delete,長而且不好管理 因此,利用c 物件離開作用域會自動呼叫析構函式的特點,在這兒實現...

物件和類在jvm記憶體中的儲存機制

物件和類在jvm記憶體中的儲存機制 引言 為什麼要有物件導向?a.可以用類組織一批不同型別的資料 b.把現實世界的物和事轉換到計算中 現實世界的物件 計算機中的類 計算機記憶體中的物件 要實現物件導向的手段和途徑,關鍵是類 類 就是乙個名字 就是乙個模型 就是乙個資料結構 就是一種資料型別 用類可以...

C 中類和結構體在記憶體中的儲存問題

簡單點,非靜態成員變數占用空間,成員函式 無論是否是靜態的 則不占用空間 class myclass myclass類的例項中 占用2 4 8個位元組 即a b這兩個成員 涉及虛函式表那些你在另外研究。c 中struct和class在計算物件大小時你就不用區別了,計算方法一樣。就拿你的例子來說 一,...