2015-02-13 17 views
5

In quali situazioni si utilizzerà il metodo release di std::unique_lock? Ho commesso l'errore di utilizzare il metodo release invece del metodo unlock e ho impiegato un po 'di tempo per capire perché il codice seguente non funzionava.quali sono i casi d'uso per std :: unique_lock :: release?

#include <mutex> 
#include <iostream> 
#include <vector> 
#include <thread> 
#include <chrono> 

std::mutex mtx; 

void foo() 
{  
    std::unique_lock<std::mutex> lock(mtx); 
    std::cout << "in critical section\n"; 
    std::this_thread::sleep_for(std::chrono::seconds(1)); 
    lock.release(); 
} 

int main() 
{ 
    std::vector<std::thread> threads; 
    for (int i = 0; i < 5; ++i) 
     threads.push_back(std::thread(foo)); 

    for (std::thread& t : threads) 
     t.join(); 
} 
+4

A parte: in questo caso si desidera un 'lock_guard', non un' unique_lock'. –

risposta

5

.release() è utile quando si desidera mantenere il mutex bloccato fino a qualche altro oggetto/code decide di sbloccarlo ... per esempio, se si dovesse mettere in una funzione che aveva bisogno il mutex bloccato e avrebbe sbloccarlo a un certo punto dell'elaborazione di quella funzione, in cui tale funzione accetta solo un valore std::mutex& anziché uno std::unique_lock<std::mutex>&&. (Concettualmente simile alla usi per funzioni rilascio puntatore intelligente.)

6

C'è un buon uso per esso in this answer cui la proprietà dello stato bloccato viene esplicitamente trasferito da una funzione locale unique_lock ad un'entità esterna (una per riferimento Parametro bloccabile).

Questo esempio concreto è tipico dell'utilizzo: trasferire la proprietà dello stato bloccato da un oggetto (o anche tipo) a un altro.

Problemi correlati