共享內存給我一個很難的時間,GDB沒有太大的幫助。我已經分配了32KB共享內存,並且我使用shmat
將其轉換爲指向包含A)a bool
和B)包含一個std::string
,3個int
s和一個bool
的對象隊列以及各種方法的指針struct
。 (我不知道這個俄羅斯套娃結構是如何做到的,但這是我知道的唯一方法。使用消息隊列不是一種選擇,我需要使用多個進程。)隊列共享內存代理
將一個對象推到隊列上工作,但是當我嘗試推一秒時,程序凍結。沒有錯誤信息,沒有任何東西。這是什麼造成的?我懷疑這是缺乏記憶,但如果是這樣,我需要多少?
編輯:如果我不清楚 - 隊列中的對象是一個類與五個數據成員描述。
編輯2:我改變了隊列條目的類別,以便它不使用std::string
。 (令人尷尬的是,我能夠用原語表示數據。)該程序在第二次push()時仍然凍結。
編輯3:我嘗試的第一個push()
後會立即調用同一個隊列front()
,並它凍結的程序了。檢查 以外的值但是,該隊列工作正常,所以它必須在隊列本身出現問題。
EDIT 4:作爲一個實驗,我添加了一個std::queue<int>
到struct
我使用的共享存儲器。它表現出相同的行爲 - push()
曾經工作過,然後front()
凍結。所以對於我用於隊列項目的類也不是問題。
This問題建議我不可能用std::queue
來解決這個問題。是這樣嗎?我應該使用boost
嗎? (在我的情況,我在父進程執行shmget()
和shmat()
,並試圖讓兩個子進程進行通信,所以它的略有不同。)
編輯5:當它調用front()
其他子進程也凍結。信號量確保在第一次調用push()
之後發生這種情況。
其中是分配了「std :: string」的內存?我打賭兩個便士,那就是你的問題所在。 – Nim
我們可以看到再現症狀的最小,完整的代碼嗎?我們不知道如何在共享內存上放置'std :: queue',如何使用信號燈等等。 – pilcrow