Вы можете сделать это, определив собственную структуру данных:
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.