我想在task_struct中添加一个指针(对象),该指针在组中的所有线程之间共享。在该对象被1个线程删除后,我怎样才能确保另一个线程不会尝试取消引用无效指针。
我可以向task_struct添加一个原子变量引用字段,然后跨进程的所有线程同步更新它们(在遍历task_structs时保持全局自旋锁)?
或者实现管理对象及其引用计数的内核线程。似乎这个问题必须由其他共享实体解决,如虚拟内存和文件句柄。
答案 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时使用它。