2013-05-08 3 views
0

Итак, я озадачен этой проблемой более часа.c возвращаемое значение через параметры

фона:

У меня есть реализация потоков ядра в xv6, что я хочу, чтобы проверить.

Потоки связывают возвращаемые значения через поле ret_val.

Каждый поток сохраняет возвращаемое значение в в другой ветке ret_val (потому что он может технически быть выделен после возврата значения).

У меня есть две части в моем коде, которые не работают, как я ожидал.

* Примечания: поле процес-> ret_val имеет тип аннулируются ** поле процес-> has_waiting имеет тип STRUCT Proc *

Часть 1 (это та часть, которая хранит возвращаемое значение в структурах текущего процесса):

// store value in WAITING THREAD's ret_val. 
    (*proc->has_waiting->ret_val) = (void*)ret_val; 
    cprintf("(t_exit)process %d is taking the return value %s\n", proc->pid, (char *)ret_val); 
    cprintf("(t_exit)process %d now has return value from %d -> %s\n", proc->has_waiting->pid, proc->pid, (char *)(*proc->has_waiting->ret_val)); 

работа в этом^Пярте для хранения значения в отставке процесса, в _val (внутри поля has_waiting, которое является указателем на структуру процесса).

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

Часть 2 (это та часть, которая пытается читать STRUCT ret_val поле процесса в):

cprintf("(t_join) process %d is taking the return value %s\n", proc->pid, (char *)(*proc->ret_val)); 
      * ret_val = proc->ret_val; // it's t's duty to set proc's ret_val 

работа в этом^Пярта является восстановление значения внутри структуры структуры (в ret_val поле), прежде чем он будет уничтожен ,

Часть 2 не работает, поле ret_val пуст.

Я пробовал всевозможные манипуляции с кастом, но, похоже, я неправильно понимаю базовую концепцию.

Я проверил структуру, к которой я обращаюсь, является правильной структурой, распечатав ее идентификатор (уникальный).

Значение, которое я передаю (в ret_val), представляет собой статическую строку (char *), которую я определил в основной функции, которая создает процессы (я хотел убедиться, что она не уничтожена или что-то еще).

Буду признателен за любую помощь. Если вам нужна дополнительная информация, дайте мне знать.

+1

Это действительно трудно прочитать. Я предлагаю изолировать вашу проблему в более удобочитаемом надуманном примере вместо вставки кода, с которым вы работаете здесь. – RandyGaul

+1

спасибо, сейчас я попробую его отредактировать –

+0

Я добавил некоторую информацию. Если бы вы могли сказать мне, какая часть наиболее запутанна, я попытаюсь ее улучшить. –

ответ

0

Если я правильно читать это, вы «вернуть» значение с помощью этого поля:

proc->has_waiting->ret_val 

но ссылки на него с помощью этого поля:

proc->ret_val 

Вы должны использовать ту же ссылку в обоих местах.

EDIT: Как насчет упрощения этого и принятия ret_val a char *?

+0

Это запутанно, но «has_waiting» также является процессом, и это HIS ret_val, который я пытаюсь прочитать в части 2. Извините за путаницу. (часть 1 -> хранится в процессе «has_waiting», часть 2 -> читается из процесса has_waiting, когда proc - это процесс «has_waiting»). –

+1

Итак, вы говорите, что 'proc' действительно' proc-> has_waiting'? – jdigital

+0

Есть много потоков. proc - текущий поток. В первой части поток (мы будем называть его thread1) устанавливает ret_val другого потока. В части 2 другой поток (назовем его thread2) пытается его прочитать. нить2 также нить1-> has_waiting (я проверял это, насколько я могу судить). –

Смежные вопросы