C ++ impulso :: rosca e recipientes de bloqueamento automático
-
22-07-2019 - |
Pergunta
Existe uma maneira de bloquear automaticamente um recipiente STL no acesso, sem a necessidade de bloqueio e liberação em torno dele?
Solução
padrão A currrent C ++ não diz nada sobre a segurança do thread para contêineres STL. Oficialmente é possível para uma implementação STL para ser thread-safe, mas é muito incomum. Se sua implementação STL não é thread-safe, então você terá de "bloqueio e liberação em torno dele" ou encontrar alguma outra maneira de coordenar o acesso.
Você pode estar interessado em da Intel Threading Building Blocks que inclui alguns fios recipientes seguros semelhantes a contêineres STL.
Outras dicas
Depois de muito Googling, parece que a maneira de fazer isso é criar um invólucro em torno de seu recipiente. por exemplo:.
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 ...
}