#c #multithreading #semaphore
#c #многопоточность #семафор
Вопрос:
В вопросе говорится, что Thread1 принимает ввод 2 чисел. Thread2 запрашивает выбор (Add / Sub). Thread3 выполняет вычисления, а основной поток выводит результат. Используйте семафор для синхронизации. Как я могу разделить потоки, и каждый из них будет выполнять разные действия. Я новичок в этом, поэтому я в замешательстве.
Комментарии:
1. Для синхронизации между потоками вы можете вместо этого использовать мьютексы. Смотрите
mtx_
Библиотеку поддержки функций @ Thread2. @Ted Lyngmo, мьютекс pthread.h не может быть разблокирован другим потоком, отличным от того, который его заблокировал. То же самое для мьютексов thread.h? Если это так, вам тоже понадобится cond var. Но это какое-то назначение, для которого требуются семафоры, поэтому лучше использовать это. Семафоры в любом случае будут работать здесь довольно хорошо.
3. @ikegami Да, я думаю, можно было бы запустить цикл блокировки-check_if_its_my_time_to_run-разблокировки , но это потребляло бы процессор, поэтому предпочтительнее использовать переменную условия. Раиса: Функции для стандартных переменных условий находятся на одной странице с именем
cnd_
4. @TedLyngmo?? Нет необходимости в какой-либо проверке блокировок, если используются семафоры.
5. @MartinJames Нет, это был ответ ikegami w.r.t. необходимость добавления переменной условия, если используется мьютекс. Это не имело никакого отношения к семафорам.
Ответ №1:
Наши потребности
- Потоку 2 необходимо дождаться, пока поток 1 сообщит, что данные доступны.
- Потоку 3 необходимо дождаться, пока поток 2 сообщит, что данные доступны.
Наши инструменты
Семафоры имеют две операции:
- сообщение: увеличьте значение семафора.
- подождите: подождите, пока значение семафора не станет положительным, и уменьшите его значение.
Мы также можем инициализировать его значением по нашему выбору.
Поток 2 должен дождаться, пока поток 1 сообщит, что данные доступны
Потоку 2 потребуется использовать ожидание, поскольку это единственная ожидающая операция. И он ожидает только в том случае, если семафор неположителен (нулевой или отрицательный), поэтому семафор должен быть инициализирован неположительным значением.
Поток 1 должен сообщить потоку 2, что данные доступны
Поскольку поток 2 ожидает, когда семафор станет положительным, мы можем инициализировать семафор равным 0, а поток 1 может использовать операцию post, чтобы сделать его положительным, когда пришло время пробуждать поток 2.
Связь между потоком 2 и потоком 3
Это идентично связи между потоком 1 и потоком 2. Поэтому мы будем использовать второй семафор идентичным образом.