ядро: синхронизирует удаление общего поля task_struct - PullRequest
0 голосов
/ 10 декабря 2011

Я хотел бы добавить указатель (на объект) на task_struct, который является общим для всех потоков в группе. После того, как объект был удален 1 потоком, как я могу гарантировать, что другой поток не будет пытаться разыменовать неверный указатель.

Могу ли я добавить поле ссылки на атомарную переменную в task_struct, а затем обновить их синхронно во всех потоках процесса (удерживать глобальную спин-блокировку при обходе task_structs)?

Или реализовать поток ядра, который управляет объектами и их счетчиками ссылок. Похоже, что эта проблема должна быть решена другими общими объектами, такими как виртуальная память и файловые дескрипторы.

1 Ответ

1 голос
/ 11 декабря 2011

Вы можете сделать это, определив собственную структуру данных: struct my_task_data { void * real_data; }

Task_struct должно быть улучшено: struct task_struct { .... struct my_task_data * mtd; };

В вызове clone () вам необходимо обработать член mdt в task_struct. real_data указывает на то, что вы хотите. Выполнение этого означает, что у вас есть один указатель от каждой task_struct на общий объект (mtd), который всегда действителен и может быть разыменован в любое время. Этот общий объект содержит указатель на ваш фактический элемент данных. Если вы хотите получить доступ к элементу, сделайте:

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

если данные NULL, другой поток удалил их, в противном случае они могут быть использованы.

Проблемы с блокировкой в ​​этом примере не показаны .

Конечно, вам нужно защитить доступ к real_data с помощью некоторого механизма блокировки, такого как мьютекс или семафор в структуре my_task_data, и использовать его при манипулировании my_task_data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...