2011-12-15 3 views
1

1つのスレッドでリンクリストにノードを追加しようとしていて、他のスレッドのリンクリストからノードを削除しようとしています。構造体をC言語のスレッド関数に渡す際に問題が発生する

if(time(NULL)== llnode-> time) 。私たちはリストの先頭ノードで時刻にアクセスしようとしています。関数に正しい引数を渡しているかどうかはわかりません。ノードを作成するスレッドは正しく動作していますが、ノードを削除するスレッドは正しく動作していません。それはセグメンテーションエラーを引き起こします。私がこれにしばらくこだわっていたので、誰かが正しい方向に向けることができれば、非常に感謝しています。 headNULLとしてオフ開始し、本質的に

void insert(struct node** head_ref, int new_room, time_t new_time); 
void deleteNode(struct node** head_ref); 
+0

リストが空になったら、wakeThread()のllnodeがNULLになる可能性があります。残りのコードがあればそれは可能でしょうか?その場合は、NULLチェックを追加できます。 –

+3

問題を正しく指し示すaixの回答に加えて、 'time(NULL)== llnode-> time'は非常に悪いことです。ネイティブのハードウェア、CPUのクロッキング、CPUの使用率、夏時間モード、および月の現在のフェーズによって異なります。代わりに '> ='を使用してください。 –

答えて

2

headmain()struct nodeへのポインタです。これはNULLに初期化され、スレッド関数に渡されます。彼らは両方ともNULLポインタを受け取ります。その後、addThread()insert()で独自のノードリストを拡張することができるかもしれませんが、wakeThread()は正しいポインタを持たないため、deleteNode()でそれを削除することは間違いありません。逆参照してクラッシュする。

3

:ここ

は、(関数は、スレッド外試験と完全に機能してきた)コードに示されていない私達の関数のプロトタイプでありますプログラムの有効期間中はNULLのままです。 NULLポインターはwakeThreadに渡され、逆参照されます(llnode->time)。これがsegfaultを引き起こすのです。

修正するには、addThreadheadになる変更がwakeThreadに表示されていることを確認する必要があります。 1つの方法は、のポインタheadに両方のスレッドに渡すことです。これを行う場合は、ロックが正しいことを確認してください!

+0

私はあなたが何を意味しているのか理解していますが、とにかく私に例を教えてもらえますか?私はCの初心者です。 – sineil