2009-10-30 5 views
3

Есть ли способ автоматически заблокировать контейнер STL при доступе, без необходимости блокировки и отпускания вокруг него?C++ boost :: thread и автоматически блокирующие контейнеры

+1

С другой стороны, имейте в виду, что любой общий ресурс представляет собой конфликтный пункт, который угрожает параллелизму вашего приложения, поэтому вам лучше свести его к минимуму. –

+1

Я не знаю, как это сделать автоматически, и это не проблема, потому что вам очень часто требуется атомарность в более широких пределах, чем методы отдельного контейнера. Например, вы обычно хотите искать в контейнере, прежде чем вставлять в него. В этом случае поиск и вставка должны выполняться в одном атомном блоке, а не в двух. Другая область, где «автоматически блокирующий» контейнер ничего не покупает, - это использование алгоритма STL на итераторах в этом контейнере. –

ответ

5

В стандарте на C++ ничего не говорится о безопасности потоков для контейнеров STL. Официально реализация STL может быть потокобезопасной, но это очень необычно. Если ваша реализация STL не является потокобезопасной, тогда вам нужно будет «заблокировать и освободить ее» или найти другой способ координации доступа.

Возможно, вас заинтересует Intel Threading Building Blocks, который включает в себя некоторые контейнеры с резьбой, подобные контейнерам STL.

+0

+1 для упоминания TBB –

2

После долгих поисковых запросов, похоже, что это сделать, чтобы создать обертку вокруг вашего контейнера. например:

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 ... 
} 
+0

Вы должны владеть блокировкой при вызове boost :: condition_variable :: notify_one() –

+0

Кроме того, вы должны указать переменную своего состояния как «not_empty» и «not_full», потому что это условия a поток может захотеть подождать. – sellibitze

Смежные вопросы