2014-06-15 5 views
5

Wir wissen, dass std::deque::front() einen Verweis auf ein erstes Element von Deque zurückgeben. würde ich wissen, ob dieser Code immer sicher ist:Verschiebe ein Element von std :: deque in C++ 11

//deque of lambdas 
deque<function<void(void)>> funs; 

// then is some other place: 
// take a lock 
m.lock(); 
auto f = move(funs.front()); // move the first lambda in f 
funs.pop_front(); // remove the element from deque //now the value is hold by f 
m_.unlock(); // unlock the resorce 
f(); //execute f 

Ich habe diesen Code mit gcc-4.9 und Arbeiten versucht, aber ich weiß nicht, ob wir diesen Code sicher betrachten kann!

+1

Es ist fast ein gültiger Code ist. Fast - weil du nicht nach Leerheit suchst. Das Verschieben des gespeicherten Elements ist eine sichere Operation. – bobah

+0

Tippfehlerbericht: Sie verwenden 'lock()' auf 'm' und' unlock() 'auf' m_'. – Notinlist

Antwort

8

Der Verschiebungskonstruktor std::function kann nicht garantiert keine Ausnahmen auslösen, so dass Sie ein Sicherheitsproblem haben. Da Sie kein RAII-Schloss für m verwenden, bleibt es gesperrt, wenn auto f = move(funs.front()); ausgelöst wird. Sie können das Problem mit std::unique_lock korrigieren:

std::unique_lock<decltype(m)> lock{m}; 
if (!funs.empty()) { 
    auto f = move(funs.front()); // move the first lambda in f 
    funs.pop_front(); // remove the element from deque //now the value is hold by f 
    lock.unlock(); // unlock the resorce 
    f(); //execute f 
} 

oder std::lock_guard:

function<void()> f; 
{ 
    std::lock_guard<decltype(m)> lock{m}; 
    if (!funs.empty()) { 
    f = move(funs.front()); // move the first lambda in f 
    funs.pop_front(); // remove the element from deque //now the value is hold by f 
    } 
} 
if (f) f(); //execute f 
+0

Hallo Casey, wahrscheinlich (für jetzt) ​​die beste Lösung ist die erste, weil im zweiten Fall die Lambdas in Haufen gespeichert und aus Leistungsgründen könnte besser sein, Auto zu verwenden –

+2

@GianLorenzoMeocci Warum sollte "auto" bessere Leistung geben? 'auto f' im ersten Ausschnitt ist identisch mit' declltype (move (funs.front()))). Wenn Sie also 'declltype (move (funs.front())) im zweiten Snippet deklarieren, erhalten Sie dasselbe. – Walter

+0

weil du mit auto die lambdas im stack speicherst –

Verwandte Themen