2017-02-26 4 views
1

CでLinkedListを作成したところ、clearという機能があります。C - スレッド内のデータ構造を解放する?

clear関数はLinkedListを反復処理し、各ノードでfree()を呼び出します。つまり、それは非常に遅いO(n)関数です。

私が代わりに私のrootノードを提供し、pthread(または私は知らない、いくつかの他のスレッドライブラリ)を作成する必要がありますが、NULLに私のLinkedListのrootノードを設定し、その後、スレッドは、リスト中にメモリーをクリーンアップしています今すぐすぐに追加する準備ができていますか?これを行う際に危険がありますか?それは、それを正しく説明するのに十分なスペースがある前に、ユーザーがLinkedListにデータを追加できることを意味しますか?それはクレジットカードのようなものですが、記憶のためです。

これは安全ですか?このような状況に対して、堅牢で迅速なコードを作成するにはどうすればよいでしょうか?

+0

"...かなり遅いです。 - 何に比べて?確かに、あなたが思っているようにメモリが漏れているのは、しばしばより高速です。それが言った:あなたが何を求めているのか明確ではない。必要な情報をすべて[mcve]に提供してください。 – Olaf

+0

リンクされたリストは、通常、パフォーマンスが低下し、解放が原因ではありません。ベンチマークがないと、参照機械と性能要件はこの問題に答えることができません。 – nwp

+0

私の意見では、これはリンクされたリスト全体をクリアする唯一の方法です。 "自分のLinkedListのルートノードをNULLに設定してから、スレッドがメモリをクリーンアップするようにする"もしあなたが他のノードにアクセスするにはどうすればいいですか? – Mouin

答えて

1

もちろん、pthreadでコンパイルした場合、freeはスレッドセーフである必要があります。

安全ですか? mutexを使用して、同時編集からアクセスが保護されていることを確認してください。

すべきですか?共通のコンテナ構造の背後にスレッドを隠すことは、アーキテクチャの悪いスタイルとみなされます。あなたの図書館のユーザーは、仕事を終わらせるブロック方法をclear()と考えます。ライブラリユーザが非同期フリーを必要とする場合、スレッドは自分自身でスレッドをforkすることができます。

リンクリストクリアにO(n)時間の複雑さが必要ですか?すべてのメモリが管理された連続ブロックにある場合は、実際にはありません。

+0

私はあなたの書かれている前に答えを書こうとしていた。スレッドを作成することによるオーバーヘッド、ロックを待っていることなど...スレッドが2つ以上あるにもかかわらず、実行の単一ユニットとして終了するということだけを追加します。 –

+0

質問は、より多くの、私は任意のデータ構造のメモリをクリアするためにスレッドを使用する必要がありますか、私はただのスレッドを使用して、メインスレッドのO(n)でクリアする必要があります。 – Hatefiend

-1

多くのスレッドでclearタスクを配布するのは良い考えではないと思います。

問題は、clear関数が返されないため、長いリスト(長い時間がかかります)のためにclearを呼び出すメインスレッドがあり、ブロックされてしまうことです。その場合は、メインスレッドと別のスレッド「ガベージコレクタ」を使用してclearコマンドを取得してメモリを解放するまで待つのが良いでしょう。

2つのスレッドを使用すると、発信者をブロックするのを避けることができます。ご質問の内容をお答えください。

+0

ちょっと混乱するかもしれません。メインスレッドがクリアスレッドを完了するのを待つのはなぜですか?メインスレッドはクリーンアップスレッドを開始して、それについては何もしないでください。 – Hatefiend

+0

@Hatefiend、 'clear'関数は、リンクされたリストノード上で空を呼び出すwhileループです。したがって、' clear'を呼び出すと呼び出し元がブロックされます。 – Mouin

+0

はい、ここには考えがあります: 'root''ノード'への参照をクリーンアップスレッドに渡します。その 'Node'を使用して、トラバースしてクリアします。一方、メインスレッドに戻ると、 'LinkedList'''構造体'の 'root'プロパティを' NULL'に設定します。これは、リスト内の古い項目が永久に消失したかのようです。リストの 'size'を' 0'に設定し、メインスレッドの 'O(1)'速度とクリーンアップスレッドの 'O(n)'速度のリスト全体をクリアしたようにします。待っていることはありません。私が間違っていない限り? – Hatefiend

関連する問題