|
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 8
|
|
Реализация собственного thread'a30.05.2012, 16:16. Показов 1353. Ответов 9
Метки нет (Все метки)
Здравствуйте, задача следующая:
Нужно написать функцию int thread_create(void (*fp)()), которая реализует thread и в качестве стека для него использует локальный массив. В этом thread`e будет выполняться функция, на которую указывает fp, при чем thread получает управление сразу после создания. Кроме того, надо написать функции void transfer_control_to_program, void transfer_control_to_thread, которые будут переключать управление между основной программой и реализованной нами нитью каждые 1/4 сек при помощи сигнала SIGALRM. В общем-то сложность заключается именно с первой функции, а именно, как заставить программу воспринимать массив в качестве стека? Я пытался с помощью inline assembly установить регистры ss на начало массива, а bp и sp на конец, но при запуске я получаю ошибку сегментирования. Есть идеи? буду очень благодарен
0
|
|
| 30.05.2012, 16:16 | |
|
Ответы с готовыми решениями:
9
Реализация собственного события
Реализация собственного умного укзателя |
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||
| 30.05.2012, 17:47 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 8
|
|
| 30.05.2012, 19:12 [ТС] | |
|
Я не думаю, что там должно быть что-то сложное, так как решения всех задач нашего препода, как правило гениально просты, сложно только понять чего же он хочет.
Но и опцию с ручным изменением jmp_buf я тоже обдумывал, просто я понятия не имею какова его внутренняя структура и инфы на эту тему не нашел. В любом случае, можно объяснение по поводу "setcontext/sigaltstack/"? То есть что это и как его понимать? (с linux имею дело впервые).
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||||
| 30.05.2012, 19:32 | ||||
|
0
|
||||
|
Заблокирован
|
|||||
| 30.05.2012, 23:52 | |||||
|
Вобщем пользуйтесь clone, он специально создан для реализации потоков
0
|
|||||
|
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 8
|
||||
| 31.05.2012, 15:54 [ТС] | ||||
|
0
|
||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||||||||||
| 01.06.2012, 09:15 | ||||||||||
0
|
||||||||||
|
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 8
|
||||||
| 10.06.2012, 21:28 [ТС] | ||||||
|
Во-первых, извините за долгое отсутствие.
Во-вторых, всем спасибо за участие. В-третьих, задача была благополучно решена следующим образом:
0
|
||||||
|
Заблокирован
|
||||||
| 11.06.2012, 01:15 | ||||||
|
Если вы хотите пользовательские потоки, то нужно было пользоваться ucontext, makecontext и swapcontext... Специально создано для этих целей. И если мне память не изменяет, то setjmp siglongjmp и прочее не обязаны сохранять состояние fpu. По крайней мере в Minix3 они этого не делают, а setcontext в конечном итоге приводит к вызову ядра sys_getmcontext, который сохраняет состояние fpu. То бишь если в ваших функциях вы будете работать с даблами, то всё это накроется медным тазом, а всё потому, что функции, которыми вы пользовались, вобщем то не предназначены для реализации многопоточности.
P.S.
Все библиотеки пользовательских потоков реализованы по одной схеме:
1) Вызывается инициализирующая функция. Она делает всякую фигню, например инициализирует шедулер, очередь потоков, которая может представлять из себя FIFO из структур thread_t, которая содержит ucontext и возвращает управление 2) Затем пользователь создаёт thread_creat поток. В libmtread в minix3 эта функция заполняет все поля в струтуре, описывающей поток, присваивает ему состоянии RUNNABLE и возвращает управление. В makecontext только не пользовательская функция передаётся, а mthread_trampoline
Вот так приблизительно выглядит многопоточность, если вы не желаете использовать clone. А эти функции из вашего задания transfer_control_to_thread, transfer_control_to_program и постановка задачи непонятно какую смысловую нагрузку они несут и какую практическую ценность имеют. Я не представляю, для чего могут понадобится подобные функции и как их прикручивать в другие приложения, помоему никак... В каждой учебной задаче должна быть какая то мораль, как в басне. То есть выполняющий должен чтото усвоить, а что можно усвоить из этой задачи? Как не нужно писать чтоли?) Многопоточностью это назвать нельзя, это всё какой то большой бессмысленный костыль... p.s. посмотреть реализацию libmthreads можно здесь http://code.metager.de/source/... ibmthread/ очень простая библиотека p.p.s как запилить себе такую же штуку как по ссылке выше, то бишь крос референс, описано в моём скромном бложике здесь https://www.cyberforum.ru/blog... og442.html
0
|
||||||
|
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 8
|
|
| 12.06.2012, 00:28 [ТС] | |
|
LosAngeles, спасибо за пояснения, было интересно узнать как это делается на проф уровне.
Но хочу заметить, что я не профессионал, я только учусь Смысловая нагрузка этого задания заключалось не в том чтобы разобраться в тонкостях нитей, а в том чтобы потренироваться использовать сигналы и глобальные переходы. И согласитесь, что делать такое задание (по крайней мере для новичка в этом деле) куда интереснее, чем реализация какого нибудь меню с возможность перехода откуда угодно в начало.
0
|
|
| 12.06.2012, 00:28 | |
|
Помогаю со студенческими работами здесь
10
Реализация собственного буфера обмена Реализация собственного события. QT4 Реализация вызова собственного события Реализация собственного класса вектора Реализация собственного класса битовых массивов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|