0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 34
|
||||||
1 | ||||||
Mutex. Синхронизация потоков. Pthread_cond_wait29.12.2019, 12:04. Показов 2303. Ответов 8
Здравствуйте! Столкнулась с проблемой в написании лабораторной работы. Задание звучит так:
Напишите функцию, удовлетворяющую следующим условиям: a. Прототип функции: int lab_pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, unsigned int timetowait); b. Входные параметры: адрес условной переменной, адрес мьютекса, количество миллисекунд, устанавливаемое для ожидания условной переменной. c. Функция возвращает следующие значения: - 0 в случае успешного выполнения функции, - 1 в случае, если время ожидания условной переменной превысило заданное в параметре timetowait количество миллисекунд, -1в случае любой ошибки. При реализации функции разрешается использовать стандартные структуры и функции библиотек ОС Linux, за исключением функции pthread_cond_timedwait(…). Ниже представлена реализация этого задания
0
|
29.12.2019, 12:04 | |
Ответы с готовыми решениями:
8
Синхронизация потоков без использования mutex Почему pthread_cond_wait() функция получает в аргументе mutex, и что делает с ним? Синхронизация потоков в OC Linux Синхронизация потоков - найти ошибку в коде |
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
30.12.2019, 08:30 | 2 |
В описании задания вы говорите о запрете только на pthread_cond_timedwait() т.е. все хорошо.
Запрет на использование pthread_cond_wait() автоматом запрещает все pthread_cond_xxx т.к если вы организуете очередь ожидания руками (вариант залезть в потроха libc не рассматриваем как грязный), то нить вставшую в ожидание на условной переменной будет не разбудить через стандартную pthread_cond_signal(). Код течет, нужно убивать нить с таймером если нас разбудили не по таймеру
0
|
0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 34
|
|
30.12.2019, 14:27 [ТС] | 3 |
prik, как мне объяснили по заданию, то что _timedwait, что _wait в данной работе запрещены (так как очень похожи) и нужно прям самим написать аналог-прототип. Только вот как это сделать без _wait большая проблема для меня. Я залезла в библиотеку, где хранится данная функция, но это тоже особо ничего не дало(
Вот ссылка на библиотеку https://github.com/lattera/gli... ond_wait.c
0
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
30.12.2019, 22:24 | 4 |
MollyLu, не готов ответить однозначно
я бы пробовал так: пишем замены для всех pthrend_cond_xxx 1й вызов pthred_cond_init создает "мастер" нить которая будет отвечать за таймер и посылку сигналов спящим нитям lab_pthread_cond_t представляет собой одну переменную атомарного типа, очередь из структур {pthread_t tid; int timeout;} отсортированную по таймауту и наверное мьютекс для защиты всей этой структуры. pthread_cond_timedwait() - добавить элемент в очередь, просигналить "мастеру", разлочить мьютекс, ждать сигнала. pthread_cond_signal() - просигналить "мастеру" - буди нить из головы очереди.
0
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|||||||||||
03.01.2020, 16:55 | 5 | ||||||||||
UP: Проспавшись и слегка отошедши, перечитал...
Дополнительные нити не нужны, берем такую структуру:
Кликните здесь для просмотра всего текста
Остальные pthread_cond_* не показываю, надеюсь, идея понятна. Вроде работает, покрайней мере проходит простейшие тесты. С наступившим и удачи!
0
|
0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 34
|
|
07.01.2020, 12:24 [ТС] | 6 |
prik, и вас с наступившим! Извините, долго разбиралась еще сама особенно с тем, как написать для остальных команд такой же шаблон, по вашему примеру, все же не до конца понимаю, как это сделать. И есть ли еще альтернативные варианты?
0
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
07.01.2020, 12:44 | 7 |
cond_init() должен выделить память под структуру и инициализировать ее, destroy() - убедиться, что очередь спящих нитей пуста и освободить все что выделил init. signal - убедиться, что очередь не пуста и разбудить хотя бы одну ждущую нить. Остальное - обвязки над ними по аналогии, например brodcast() - вызвать signal() для всех нитей из списка ожидания.
Годиться любой объект на котором можно синхронизироваться, например футекс или пайп.
0
|
0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 34
|
|
07.01.2020, 17:07 [ТС] | 8 |
я имею в виду есть ли дркгие варианты написании аналогичной функции, без изменения других pthread_cond_*? Просто это по факту похоже на переписывание библиотеки, просто со своими названием всех других функций. Я думаю, должен быть какой-то более простой вариант, не такой ресурсозатратный
0
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
08.01.2020, 08:58 | 9 |
Так от вас фактически этого и хотят.
Что бы ограничится заменой только одной функции нужно взять определение структуры на которою ссылается pthread_cond_t из libc (причем от версии libc из системы на которой вы будете сдавать это задание), утянуть в свой проект с десяток вспомогательных ф-ций не экспортируемых из libc, и наконец, переписать своими словами pthread_cond_timedwait(). Но будет ли это проще?
0
|
08.01.2020, 08:58 | |
08.01.2020, 08:58 | |
Помогаю со студенческими работами здесь
9
Синхронизация потоков для вычисления дисперсии Синхронизация потоков, thread-safe usleep Mutex и синхронизация потоков Mutex - синхронизация Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Как обучить нейросеть создания картинок на Python
bytestream 24.01.2025
В эпоху цифровых технологий искусственный интеллект становится неотъемлемой частью творческого процесса. Особое место в этой области занимает разработка и обучение нейронных сетей для создания. . .
|
Как обучить нейросеть генерации текста на Python
bytestream 24.01.2025
В современном мире искусственный интеллект и машинное обучение становятся неотъемлемой частью многих технологических решений. Одной из наиболее интересных и востребованных задач в этой области. . .
|
Машинное обучение на Python
bytestream 24.01.2025
Введение в машинное обучение на Python
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, которая позволяет компьютерным системам. . .
|
Как удалить вирус-майнер с компьютера
hw_wired 24.01.2025
Вирусы-майнеры стали одной из наиболее серьезных угроз для пользователей компьютеров. Эти вредоносные программы тайно используют вычислительные ресурсы зараженного устройства для добычи криптовалюты. . .
|
Что такое веб-сервер, для чего он нужен и как работает
bytestream 24.01.2025
В современную эпоху цифровых технологий веб-сервер является фундаментальным компонентом интернет-инфраструктуры, обеспечивающим функционирование множества онлайн-сервисов и веб-сайтов. Этот. . .
|
Как в цикле for перебрать все элементы в словаре в Python
bytestream 24.01.2025
Словари в Python представляют собой мощные структуры данных, которые позволяют хранить информацию в формате ключ-значение. Эта особенность делает их незаменимыми при работе с данными, где требуется. . .
|
Как отменить rebase в Git
hw_wired 24.01.2025
Git rebase представляет собой мощный инструмент для управления историей коммитов в системе контроля версий Git. Этот механизм позволяет разработчикам изменять последовательность, комбинировать или. . .
|
Как поменять цвет input placeholder с помощью CSS
bytestream 24.01.2025
В веб-разработке оформление элементов пользовательского интерфейса играет ключевую роль в создании привлекательного и интуитивно понятного дизайна. Особое внимание уделяется формам ввода данных, где. . .
|
Как перебрать все значения в перечислении (enum) в C#
bytestream 24.01.2025
Перечисление (enum) в языке программирования C# представляет собой специальный тип данных, который позволяет определить набор именованных констант. Этот мощный инструмент особенно полезен, когда. . .
|
Как обойтись без проверки на null, чтобы избежать NullPointerException в Java
bytestream 24.01.2025
NullPointerException (NPE) является одним из самых распространенных исключений в Java, создающих серьезные проблемы при разработке программного обеспечения. Данное исключение возникает при попытке. . .
|
Что лучше использовать в href ссылок в JavaScript: "#" или "javascript:void(0)"
bytestream 24.01.2025
При разработке веб-приложений важную роль играет правильное использование HTML-ссылок в сочетании с JavaScript. Одним из ключевых аспектов является выбор корректного значения атрибута href для. . .
|
Как узнать индекс элемента списка по его значению в Python
hw_wired 24.01.2025
При работе с коллекциями данных в Python часто возникает необходимость не только манипулировать элементами списка, но и определять их точное местоположение. Индекс элемента представляет собой. . .
|