2011-12-10 50 views
0

的共享字段的同步刪除我想加指針(對一個對象)的task_struct在所述組中的所有線程之間共享。在對象被1個線程刪除之後,我如何確保另一個線程不會嘗試解除引用無效指針。內核:的task_struct

我能添加一個原子變量參考外地的task_struct,然後同步更新它們跨越進程的所有線程(持有全球自旋鎖在遍歷task_structs)?

或實現管理對象及其引用計數內核線程。看起來像這個問題必須已被其他共享實體解決,如虛擬內存和文件句柄。

回答

1

你可以通過定義你自己的數據結構來做到這一點: struct my_task_data void * real_data { void * real_data; }

task_struct中必須得到加強: 結構的task_struct { .... 結構my_task_data * MTD; };

在克隆()調用,你需要處理的task_struct的MDT成員。 real_data指向任何你想要的。這樣做意味着你有一個指針從每個task_struct到一個共享對象(mtd),這個對象總是有效的,並且可以隨時解除引用。這個共享對象包含一個指向實際數據項的指針。當您要訪問的項目做:

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

如果數據爲空,另一個線程刪除了它,否則它可以使用。

鎖定問題並不在這個例子中所示。

當然,你需要一些鎖定機制來保護訪問real_data,像my_task_data結構互斥或信號,並用它在操縱my_task_data。