Boost.Thread имеет мьютексы и условные переменные. Чисто с точки зрения функциональности семафоры поэтому избыточны [*], хотя я не знаю, поэтому ли они и опущены.
Семафоры - это более простой примитив, более простой и, возможно, реализованный, чтобы быть быстрее, но не имеет предотвращения приоритета. Возможно, их сложнее использовать, чем условные переменные, потому что они требуют, чтобы клиентский код гарантировал, что количество постов «соответствует» количеству ожиданий соответствующим образом. С помощью условных переменных легко допустить ложные сообщения, потому что никто на самом деле ничего не делает без проверки условия.
Ресурсы чтения и записи - это IMO с красной сельдью, они не имеют никакого отношения к разнице между мьютексом и семафором. Если вы используете счетный семафор, вы можете столкнуться с ситуацией, когда несколько потоков одновременно обращаются к одному и тому же ресурсу, и в этом случае он, вероятно, должен иметь доступ только для чтения. В этой ситуации вы могли бы вместо этого использовать shared_mutex
из Boost.Thread. Но семафоры «не для» защиты ресурсов, как мьютексы, они «для» отправки сигнала из одного потока в другой. Можно использовать их для управления доступом к ресурсу.
Это не означает, что все виды использования семафоров должны относиться к ресурсам только для чтения. Например, вы можете использовать двоичный семафор для защиты ресурса чтения / записи. Впрочем, это может быть плохой идеей, поскольку мьютекс часто дает вам лучшее планирование.
[*] Вот примерно как вы реализуете счетный семафор, используя мьютекс и условную переменную. Конечно, для реализации общего семафора вам нужен общий мьютекс / condvar:
struct sem {
mutex m;
condvar cv;
unsigned int count;
};
sem_init(s, value)
mutex_init(s.m);
condvar_init(s.cv);
count = value;
sem_wait(s)
mutex_lock(s.m);
while (s.count <= 0) {
condvar_wait(s.cv, s.m);
}
--s.count;
mutex_unlock(s.m);
sem_post(s)
mutex_lock(s.m);
++s.count;
condvar_broadcast(s.cv)
mutex_unlock(s.m);
Следовательно, все, что вы можете делать с семафорами, вы можете делать с мьютексами и условными переменными. Не обязательно путем фактической реализации семафора.