2011-12-10 9 views
0

私はグループ内のすべてのスレッド間で共有されているtask_structに(オブジェクトへの)ポインタを追加したいと思います。オブジェクトが1スレッドで削除された後、別のスレッドが無効なポインタを逆参照しようとしないようにするにはどうすればよいでしょうか。カーネル:task_structの共有フィールドの同期削除

task変数の参照フィールドをtask_structに追加して、プロセスのすべてのスレッド間で同期して更新できますか(task_structsをトラバースしながらグローバルスピンロックを保持する)?

または、オブジェクトとその参照カウントを管理するカーネルスレッドを実装する。この問題は、仮想メモリやファイルハンドルなどの他の共有エンティティによって解決されている必要があるようです。

答えて

1

自分でデータ構造を定義することでこれを行うことができます。 struct my_task_data { void * real_data; }

task_structが向上しなければならない: 構造体task_struct { ....構造体my_task_data * MTD。 };

clone()コールでは、task_structのmdtメンバーを処理する必要があります。 real_dataは必要なものを指します。このようにすると、各task_structから常に有効な共有オブジェクト(mtd)へのポインタが1つあり、いつでも参照解除することができます。この共有オブジェクトには、実際のデータ項目へのポインタが含まれています。あなたが項目にアクセスしたいときに行います。データがNULLである場合

data = current()->mtd->real_data; 

を別のスレッドでは、それ以外の場合は使用することができ、それを削除しました。

ロックの問題はこの例では表示されません

もちろん、my_task_data構造体のミューテックスやセマフォなどのロック機構によってreal_dataへのアクセスを保護し、my_task_dataを操作する際にそれを使用する必要があります。

関連する問題