2016-09-06 3 views
1

Ich bin mir bewusst, dass kein STL-Container Fadensicherheit garantiert. Ich weiß auch, dass es mit std :: lock_guard nicht so schwer ist, es zu implementieren. Aber für das, was ich gerade mache, werde ich mindestens einen Thread verwenden, um Dinge auf eine Deque zu schieben und einen anderen, um sie zu entfernen. Es gibt keine garantierte Anzahl von Threads, aber ich kann garantieren, dass jeder Thread entweder Push oder Pull, aber nicht beide, wenn das überhaupt relevant ist.Ist zusammen gehacktes Threadsicherheit die 'beste' Vorgehensweise?

Ich habe so etwas wie dies getan:

template<typename T, typename... Args> 
class SafeDeque { 
    std::deque<T, Args...> m_deque; 
    std::mutex m_mu; 

public: 
    SafeDeque() { } 

    void push_back(const T& val) { 
     std::lock_guard<std::mutex> lock(m_mu); 
     m_deque.push_back(val); 
    } 

    void push_front(const T& val) { 
     std::lock_guard<std::mutex> lock(m_mu); 
     m_deque.push_front(val); 
    } 

    T& back(void) { 
     std::lock_guard<std::mutex> lock(m_mu); 
     return m_deque.back(); 
    } 

    const T& back(void) const { 
     std::lock_guard<std::mutex> lock(m_mu); 
     return m_deque.back(); 
    } 

    T& front(void) { 
     std::lock_guard<std::mutex> lock(m_mu); 
     return m_deque.front(); 
    } 

    const T& front(void) const { 
     std::lock_guard<std::mutex> lock(m_mu); 
     return m_deque.front(); 
    } 

}; 

Doch diese nur auf einer bestimmten Ebene ‚fühlt‘ seltsam. Gibt es einen besseren Weg, es nur mit Standard C++ 11/14 zu tun? Ich habe das gesehen:
https://github.com/cameron314/concurrentqueue

Aber ich würde lieber mit etwas Standard bleiben, wenn ich es helfen kann.

+3

Es sei denn, Sie können garantieren, dass kein anderer Thread ein Element aus der Warteschlange, diese 'Front()' s und 'zurück()' s entfernen sind wird nicht fadensicher. Nach der Rückkehr wird die Sperre aufgehoben, und nichts hindert einen anderen Thread daran, den Wert der Warteschlange in den Abfluss zu spülen, sodass ein unbeabsich- tigter Verweis für den hilflosen Thread übrig bleibt. –

+0

@SamVarshavchik Guter Punkt. Es ist wirklich ein Thread, der jeden ab sofort erledigt, aber das ist etwas, auf das ich achten muss, wenn ich es erweitere. Vielen Dank. – Goodies

+0

Obwohl ich shared_ptrs als Objekte hier verwende ... – Goodies

Antwort

Verwandte Themen