使用具有共享内存的线程

Use thread with shared memory

我有一个 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");

    }
}


我只是想用线程将数据从共享内存复制到不同的内存。

好的,您编写的代码存在一些问题。首先,main 几乎肯定会在线程有机会 运行 之前退出。但是即使这不是 main 而是其他东西(因此你的程序不会试图退出),那么 bufferList 在你的线程 运行s.

之前超出范围

此时 Francois 使用 thread->join() 可能是正确的,尽管我通常不同意他的观点。有时分离,有时使用连接。

您确定错误是关于共享内存而不是关于 bufferList 的吗?

我会这样做。首先,我会将分离更改为连接,然后我会在您调用的函数中添加调试语句。只要 main 不会 return 太快,代码就应该可以工作。