2

05:00 AM のダーティ ハック。同じプロセスのスレッド間で FIFO を使用してポインターのアドレスを渡すことにより、SO を犯しました。

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+pure pthreads アプリケーションのプラグインが直接通信しようとしている状況で、これが発生する理由として考えられるものは何ですか? なんらかの理由で、明らかなガベージコレクションではないと感じています.Linuxスレッドは共有プロセスメモリを使用しているため、アドレスの不一致はなく、ポインターの逆参照も問題ないようです.

4

2 に答える 2

5

ここで試してみるべきだと思います:

long addr = (long)total_buf; /* removed & */

...後で addr を最初に void* にキャストし、次に char* にキャストするためです。バージョンの addr は、ポインターへのポインターの長いバージョンであり、バッファーへのポインターの長いバージョンではありません。

于 2013-08-25T02:47:04.640 に答える