0

私はスレッドを使用するのが初めてで、スレッドで動作するキューを作成することをお勧めします。しかし、何かがおかしいです。消費者スレッドが同じデータまたは何かにアクセスしようとしていると思われます。私はミューテックスを使用していますが、おそらく何かを誤解しています...

このエラーが発生します(約3回の実行ごとに):

*** glibc detected *** ./t_queue_test: double free or corruption (fasttop): 0x0000000002114610 ***

コードはかなり長いので、pastebin に投稿しましたが、それが間違っている場合は、ここに貼り付けることができます。

t_queue.h -> http://pastebin.com/2KYmujeE

t_queue.c -> http://pastebin.com/1wZPMwDB

t_queue_test.c -> http://pastebin.com/QKCTQWaf

関数 'get_q' でエラーが発生したと思われ、コードでマークしました。

ポインタや提案をありがとう。同様の質問についてstackoverflowを掘り下げましたが、さらに掘り下げます。Valgrind もまだ何も表示されません。

4

1 に答える 1

1

Pastebin がなくなった場合に備えて、後でメモしておきます。問題のあるコードはこれです。

if(q->rear != NULL && q->front != NULL)
{
    node_n = q->front;
    *d = node_n->data;
    q->front = node_n->next;
    free(node_n);           
}

フロントは問題なくクリーンアップされますが、最後の要素が削除された場合は、キューが空であることを反映するためにリアも更新する必要があります。たとえば、これで十分です。

if(q->rear != NULL && q->front != NULL)
{
    node_n = q->front;
    *d = node_n->data;
    q->front = node_n->next;
    if(q->front == NULL) 
      q->rear = NULL;
    free(node_n);
} 
于 2012-08-25T16:05:09.677 に答える