我有一個 exe 將資料寫入共享記憶體而不是從共享記憶體讀取資料,我想std::thread在將共享記憶體復制到不同的記憶體時使用,因為 writer exe 不會停止寫入。
當我std::thread用于復制共享記憶體時,我將記憶體結構作為引數傳遞,而不是記憶體結構在執行緒函式中將為空,但是當正常使用該函式時,函式記憶體結構將如我所料。我錯過了什么或std::thread不能用于共享記憶體嗎?
struct Foo {
imgHeader imgHeader;
uint8_t imgBuf[12441600];
}
void memCpyFunc(uint8_t buf[12441600], std::list<uint8_t*>& bufferList) {
uint8_t* ImgBuffer = new uint8_t[12441600];
memcpy(ImgBuffer, buf, 12441600);
bufferList.push_back(ImgBuffer);
}
int main(){
Foo* foo;
shmid = shmget(SHM_KEY, sizeof(Foo), 0666 | IPC_CREAT);
foo = (Foo*)shmat(shmid, NULL, 0);
std::list<uint8_t*> bufferList;
memCpyFunc(foo->imgBuf, bufferList); //It works
std::thread thread(&memCpyFunc, foo->imgBuf, std::ref(bufferList)); //Segmantation Fault
//foo->imgBuf error: Cannot access memory at address 0x7ffff03b3078
thread.detach();
if (shmdt(foo) == -1) {
perror("shmdt");
}
}
我只是想用執行緒將資料從共享記憶體復制到不同的記憶體。
uj5u.com熱心網友回復:
好的,您撰寫的代碼存在一些問題。首先,main 幾乎肯定會在執行緒有機會運行之前退出。但即使這不是 main 而是其他東西(因此你的程式不會試圖退出),那么 bufferList 在你的執行緒運行之前就會超出范圍。
這是 Francois 關于使用 thread->join() 的正確時機,盡管我通常不同意他的觀點。有時要分離,有時要使用連接。
你確定錯誤是關于共享記憶體而不是關于bufferList嗎?
我會這樣做。首先,我將分離更改為連接,然后將除錯陳述句粘貼到您正在呼叫的函式中。只要 main 不會回傳太快,代碼就應該可以作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444725.html
