凌晨 5:00 的肮脏黑客。我犯了罪,所以,通过使用 FIFO 在同一进程的线程之间传递指针的地址:
total_buf = (char*)malloc(msize);
// ...
long addr = (long)&total_buf;
// ...
write(fifo, buf, 128);
在接收器线程中接收到指向 total_buf 的指针后,void* pt = (void*)addr;char* tbuf = (char*)pt;
我注意到缓冲区内容发生了变化,这很明显通过检查内存内容确认:(gdb) x/1024xb tbuf
。
发生这种情况的可能原因是什么 - 在多线程 Qt + 纯 pthreads 应用程序的插件试图直接通信的上下文中?出于某种原因,我觉得这不是一些明显的垃圾收集而且公平,Linux 线程正在使用共享进程内存,所以它没有地址不匹配,指针取消引用看起来也不错。
请您参考如下方法:
我猜你应该试试:
long addr = (long)total_buf; /* removed & */
...因为您稍后首先将 addr 转换为 void*,然后再转换为 char*。您的版本中的 addr 是指向指针的长版本,而不是指向缓冲区的长版本指针。