Есть ли способ автоматически заблокировать контейнер STL при доступе, без необходимости блокировки и отпускания вокруг него?C++ boost :: thread и автоматически блокирующие контейнеры
ответ
В стандарте на C++ ничего не говорится о безопасности потоков для контейнеров STL. Официально реализация STL может быть потокобезопасной, но это очень необычно. Если ваша реализация STL не является потокобезопасной, тогда вам нужно будет «заблокировать и освободить ее» или найти другой способ координации доступа.
Возможно, вас заинтересует Intel Threading Building Blocks, который включает в себя некоторые контейнеры с резьбой, подобные контейнерам STL.
+1 для упоминания TBB –
После долгих поисковых запросов, похоже, что это сделать, чтобы создать обертку вокруг вашего контейнера. например:
template<typename T>
class thread_queue
{
private:
std::queue<T> the_queue;
mutable boost::mutex the_mutex;
boost::condition_variable the_condition_variable;
public:
void push(T const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
the_queue.push(data);
lock.unlock();
the_condition_variable.notify_one();
}
etc ...
}
Вы должны владеть блокировкой при вызове boost :: condition_variable :: notify_one() –
Кроме того, вы должны указать переменную своего состояния как «not_empty» и «not_full», потому что это условия a поток может захотеть подождать. – sellibitze
- 1. C++ boost thread и mutex
- 2. C++ boost thread delay
- 3. C++ 11 thread vs boost thread
- 4. C++ boost thread id и Singleton
- 5. C++ Ошибка привязки (Boost thread)
- 6. boost thread with C++ 11lambda
- 7. Автоматическое связывание для boost :: thread в C++?
- 8. boost :: bind, boost :: asio, boost :: thread и classes
- 9. Is boost :: thread thread-safe?
- 10. Thread Safe Data и Потокобезопасная Контейнеры
- 11. boost :: thread и функции шаблона
- 12. Блокирующие блокировки и блокирующие блокировки
- 13. PThread vs boost :: thread?
- 14. Linking Boost thread library
- 15. Управление потоками и параллелизм с boost :: thread
- 16. Использование boost :: lambda with boost :: thread
- 17. Boost Optional with Boost Thread компиляция проблема
- 18. Porting C++ 11 std :: thread to boost :: thread compile issues
- 19. C++ 11 Thread vs Boost Thread есть какая-то разница?
- 20. C++: Instantiate boost :: thread в заголовке
- 21. boost :: thread - простой пример не работает (C++)
- 22. C++ Boost :: ASIO Thread Pool issue
- 23. Ошибка компоновщика C++ с использованием Boost Thread
- 24. boost: thread crashes microsoft C++ компилятор
- 25. Как спать в C++ Boost Thread
- 26. C++ // передать массив Boost :: array для Boost :: thread
- 27. Зачем boost :: thread constructor не принимает параметр boost :: thread :: attributes?
- 28. Boost BGL thread safety
- 29. Boost Thread Отмена
- 30. boost thread error
С другой стороны, имейте в виду, что любой общий ресурс представляет собой конфликтный пункт, который угрожает параллелизму вашего приложения, поэтому вам лучше свести его к минимуму. –
Я не знаю, как это сделать автоматически, и это не проблема, потому что вам очень часто требуется атомарность в более широких пределах, чем методы отдельного контейнера. Например, вы обычно хотите искать в контейнере, прежде чем вставлять в него. В этом случае поиск и вставка должны выполняться в одном атомном блоке, а не в двух. Другая область, где «автоматически блокирующий» контейнер ничего не покупает, - это использование алгоритма STL на итераторах в этом контейнере. –