kernel:同步删除task_struct的共享字段

时间:2011-12-10 15:12:23

标签: linux-kernel process

我想在task_struct中添加一个指针(对象),该指针在组中的所有线程之间共享。在该对象被1个线程删除后,我怎样才能确保另一个线程不会尝试取消引用无效指针。

我可以向task_struct添加一个原子变量引用字段,然后跨进程的所有线程同步更新它们(在遍历task_structs时保持全局自旋锁)?

或者实现管理对象及其引用计数的内核线程。似乎这个问题必须由其他共享实体解决,如虚拟内存和文件句柄。

1 个答案:

答案 0 :(得分:1)

您可以通过定义自己的数据结构来完成此操作:     struct my_task_data {         void * real_data;     }

必须增强task_struct:     struct task_struct {          ....          struct my_task_data * mtd;     };

在clone()调用中,您需要处理task_struct的mdt成员。 real_data指向你想要的任何东西。这样做意味着你有一个指针从每个task_struct到一个共享对象(mtd),它总是有效的,并且可以随时解除引用。此共享对象包含指向实际数据项的指针。当您想要访问该项目时:

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

如果data为NULL,则另一个线程删除它,否则可以使用它。

此示例中未显示锁定问题

当然,您需要通过某种锁定机制来保护对real_data的访问,例如my_task_data结构中的互斥锁或信号量,并在操作my_task_data时使用它。