使用具有共享内存的线程
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 太快,代码就应该可以工作。
我有一个 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 太快,代码就应该可以工作。