Преимущества:
«Семафор асинхронный сигнал безопасен» (ссылка [2])
Недостатки:
«Я думаю, что не нужны примитивы синхронизации семафора, потому что с условным переменным мьютексом может полностью заменить свою функцию, и менее подвержены ошибкам ... Еще одна проблемы, с семафорами, что он имеет свое собственное значение счетчика, как правило, наши собственные структуры данных также имеет значение длины, в результате которой в той же самой информации, сохраненной два «(ссылка [1])
«Поток может увеличить сигнал является уменьшение количества другого потока, эта гибкость может привести к ухудшению структуры синхронного дизайна» (ссылка [2])
Вывод:
применения семафоров, можно считать заменены мьютексом + переменным условием.
Семафор параллельное программирование вроде «Гото» в целом, но это простой интерфейс, легкий вызов.
------------------------------------------
Кроме того, их правильное неверное представление: значение сигнала количестве 1 эквивалент в мьютекс.
Только вы должны написать один практический производитель - потребитель одного демо можно понять.
Пример 1:
1 // кодирование резьбы 2 thread_encode () { . 3 из sem_wait (& task_assigned); // заблокированными задач , ожидающих . 4 кодирования (); . 5 sem_post (& task_done); // уведомляет выполнения задачи 6 } 7 // задача резьбы 8. Thread_main () { 9. из sem_wait (& task_done); // блокируется в ожидании завершения задачи 10 send_data_if_has (); . 11 New_Task (); 12 sem_post (& task_assigned); // выдано уведомление задача 13 } 14 sem_init (& task_done, 0 , 1. );// начальное состояние, "задача не завершена" 15 sem_init (& task_assigned, 0 , 0 ); // не новое распределение задач
Сравнительный пример 2
1 // 编码线程 2 thread_encode () { 3 pthread_mutex_lock (& мьютекс); 4 кодирования (); 5 pthread_mutex_unlock (& мьютекс); 6 } 7 // 任务线程 8 thread_encode () { 9 pthread_mutex_lock (& мьютекс); 10 send_data_if_has (); 11 new_task (); 12 pthread_mutex_unlock (& мьютекс); 13 }
разница
ссылка
[1] «Linux многопоточное программирование на стороне сервера,» Тема синхронизации Основы Главы 2.3 для чтения и записи, не используйте замки и семафоры
[2] «Linux Руководство по программированию» Р907 POSIX Pthreads мьютекс семафор в сравнении