Board.KolibriOS.org
http://board.kolibrios.org/

Вопросы по некоторых функциях...
http://board.kolibrios.org/viewtopic.php?f=2&t=2157
Page 2 of 5

Author:  johnfound [ Sun Oct 21, 2012 3:27 am ]
Post subject:  Re: Вопросы по некоторых функциях...

Ну продолжим с потоках.
Что делать со стеком, когда завершается поток?
Память для стек потока я выделяю динамически и ее надо освободить.
Но поток не может освободит свой собственный стек.
А другие потоки приложения просто не знают что поток завершился. Как быть?

Author:  Mario [ Sun Oct 21, 2012 9:46 am ]
Post subject:  Re: Вопросы по некоторых функциях...

johnfound wrote:
Но поток не может освободит свой собственный стек.
А другие потоки приложения просто не знают что поток завершился. Как быть?

Отчего же?
Code:
   mcall   68,13,[thread_stack_2]
   mcall   -1   ; close this program

В zSea у меня это вполне работает.

Author:  johnfound [ Sun Oct 21, 2012 10:35 am ]
Post subject:  Re: Вопросы по некоторых функциях...

Mario wrote:
Отчего же?
Code:
   mcall   68,13,[thread_stack_2]
   mcall   -1   ; close this program

В zSea у меня это вполне работает.


Как "отчего же"? Если память стека освобождается после 68,13 то откуда взялся аддрес возврата чтобы поток, потом выполнил mcall -1? И даже если чудесным образом поток вернулся куда надо, то где mcall -1 будет запоминать свой адрес возвратa?
Мне кажется что у тебя поток должен умирать из за GPF, а не из за mcall -1.

Author:  Serge [ Sun Oct 21, 2012 3:18 pm ]
Post subject:  Re: Вопросы по некоторых функциях...

Вот не надо путать людей макросами.
Code:
   mov eax, 68
   mov ebx, 13
   mov ecx, [thread_stack_2]
   int 0x40
   mov eax, -1
   int 0x40

Author:  Mario [ Sun Oct 21, 2012 4:00 pm ]
Post subject:  Re: Вопросы по некоторых функциях...

johnfound wrote:
Мне кажется что у тебя поток должен умирать из за GPF, а не из за mcall -1.

Теоретически да, однако на практике все работает - никакой ругани на доску отладки не выводится.

Author:  johnfound [ Sun Oct 21, 2012 4:31 pm ]
Post subject:  Re: Вопросы по некоторых функциях...

Но так выходит что можно ф.-1 вообще не вызывать и так поток завершится на возвращения из ф.68, а может и раньше.

Author:  Serge [ Sun Oct 21, 2012 5:09 pm ]
Post subject:  Re: Вопросы по некоторых функциях...

Ничего там не умирает по GPF. Эти функции не обращаются к стеку приложения.
Но если так страшно, есть простое решение
Code:
   mov esp, tmp_stack
   mov eax, 68
   mov ebx, 13
   mov ecx, [thread_stack_2]
   int 0x40
   mov eax, -1
   int 0x40

rd 4  ;с большим запасом
tmp_stack:

Author:  johnfound [ Sun Oct 21, 2012 7:01 pm ]
Post subject:  Re: Вопросы по некоторых функциях...

Serge wrote:
Ничего там не умирает по GPF. Эти функции не обращаются к стеку приложения.
Но если так страшно, есть простое решение
Code:
   mov esp, tmp_stack
   mov eax, 68
   mov ebx, 13
   mov ecx, [thread_stack_2]
   int 0x40
   mov eax, -1
   int 0x40

rd 4  ;с большим запасом
tmp_stack:


Просто, но не совсем. Я тоже думал сделать так, но дело в том, что это будет работать правильно если всегда завершается только один поток. А в многопоточном приложении это совсем невозможно гарантировать.
Поэтому приходим к следующего вопроса: Как реализовать мьютексов в Колибри? :)

Author:  Serge [ Sun Oct 21, 2012 8:47 pm ]
Post subject:  Re: Вопросы по некоторых функциях...

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

Author:  Mario [ Sun Oct 21, 2012 9:07 pm ]
Post subject:  Re: Вопросы по некоторых функциях...

Зачем изобретать лисопеды, если простое как лопата решение уже работает?

Author:  Serge [ Sun Oct 21, 2012 11:04 pm ]
Post subject:  Re: Вопросы по некоторых функциях...

Mario
Если ты создаёшь произвольное число потоков одной переменной thread_stack_2 на всех не хватит.

Author:  Mario [ Sun Oct 21, 2012 11:14 pm ]
Post subject:  Re: Вопросы по некоторых функциях...

Serge wrote:
Mario
Если ты создаёшь произвольное число потоков одной переменной thread_stack_2 на всех не хватит.

Зачем? :shock:
У меня на каждый задуманный поток свой стек и своя переменная:
Spoiler: Show
Code:
;---------------------------------------------------------------------
; clear bacground thread
clear_thread_stack:
   dd 0
;----------------------
; window option
thread_stack_7:
   dd 0
;----------------------
; window error message
thread_stack_6:
   dd 0
;----------------------
; window set sort mode
thread_stack_5:
   dd 0
;----------------------
; window background
thread_stack_4:
   dd 0
;----------------------
; window about
thread_stack_3:
   dd 0
;----------------------
; file info
thread_stack_2:
   dd 0
;----------------------
; file open
thread_stack:
   dd 0
;---------------------------------------------------------------------

Это конечно не произвольное количество, но мне произвольное и не нужно.

А предыдущий пост мой касался самоубиения вторичного потока, без всяких извратов с подменой значения ESP. Если стек для сепуку не нужен, как ты сам доказал, то зачем придумывать специальный лисопед?

Author:  johnfound [ Mon Oct 22, 2012 12:35 am ]
Post subject:  Re: Вопросы по некоторых функциях...

Я создаю произвольное количество потоков - потому что пишу библиотеку, которая должна этого уметь. И при этом у меня потоки должны заканчивать на ret (но это совсем другая история).

Давайте уточнить напоследок: Чтобы вызывать int $40, стек приложению совершенно не нужен. Правильно?

Author:  Mario [ Mon Oct 22, 2012 12:48 am ]
Post subject:  Re: Вопросы по некоторых функциях...

johnfound wrote:
Давайте уточнить напоследок: Чтобы вызывать int $40, стек приложению совершенно не нужен. Правильно?

Стек нужен для сохранения регистров. Если функция их не изменяет или вообще не возвращает значений, то не нужен - это же прерывание. В общем все зависит о реализации вызываемой функции.

Author:  johnfound [ Mon Oct 22, 2012 1:15 am ]
Post subject:  Re: Вопросы по некоторых функциях...

Мои знания о прерываниях находятся на ниво 8088 :lol: - там стек обязательно нужен.
А где запоминаются адрес возврата и регистр флагов?

Page 2 of 5 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/