Прошло много времени с тех пор, как я работал в C ++, и я не видел поддержки потоков Boost , но я нашел очень полезным инкапсулировать семафор сервисов, предоставляемых ОС, обычно это либо POSIX , либо Win32, в простых классах, которые могут получить блокировки и освободить их в деструкторах, что делает их использование довольно простым.
void operateOnSharedResource(SharableResource & foo) {
MutexLock lock(foo.getMutex());
// do stuff to foo
// implicit call to MutexLock dtor performs release
}
В конечном счете, существует множество простых трюков, подобных этому, чтобы упростить программирование потоков, и я был бы удивлен, если бы Boost не имел ничего подобного сейчас (РЕДАКТИРОВАТЬ: он есть и задокументирован в Типы блокировок ).
Несмотря на это, основная проблема с написанием многопоточного кода не будет решена какой-либо сторонней библиотекой, и это понимание того, где ваш код может быть с пользой распараллелен, и где общие ресурсы должны быть затронуты и должны быть приходилось. Вот несколько практических правил, которые я использую при написании многопоточного кода.
- Попробуйте свести к минимуму количество общих ресурсов
- Попробуйте инкапсулировать разделяемые ресурсы в оболочки классов, которые делают все операций атомарными.
- Сделать рабочие потоки максимально простыми
Правильная инкапсуляция действительно творит чудеса для написания более безопасного многопоточного кода, потому что чем меньше вещей вы можете увидеть, тем меньше у них может быть состояние гонки.