Sto cercando di usare di lettura/scrittura di blocco in C++ usando shared_mutexLeggi Scrivi implementazione di blocco in C++
typedef boost::shared_mutex Lock;
typedef boost::unique_lock<Lock> WriteLock;
typedef boost::shared_lock<Lock> ReadLock;
class Test {
Lock lock;
WriteLock writeLock;
ReadLock readLock;
Test() : writeLock(lock), readLock(lock) {}
readFn1() {
readLock.lock();
/*
Some Code
*/
readLock.unlock();
}
readFn2() {
readLock.lock();
/*
Some Code
*/
readLock.unlock();
}
writeFn1() {
writeLock.lock();
/*
Some Code
*/
writeLock.unlock();
}
writeFn2() {
writeLock.lock();
/*
Some Code
*/
writeLock.unlock();
}
}
Il codice sembra funzionare bene, ma ho alcune domande concettuali.
Q1. Ho visto i consigli per utilizzare unique_lock e shared_lock su http://en.cppreference.com/w/cpp/thread/shared_mutex/lock, ma non capisco perché perché shared_mutex supporta già i metodi lock e lock_shared?
Q2. Questo codice ha il potenziale per causare la fame di scrittura? Se sì, allora come posso evitare la fame?
Q3. C'è qualche altra classe di blocco che posso provare ad implementare il blocco di scrittura?
Se si osserva la mancanza di digiuno (o in caso di inedia), presentare una segnalazione di errore. Esistono algoritmi che assicurano che la fame non avvenga, e questo è il motivo per cui non vi è alcuna API di priorità reader/writer in questo codice. Vedi http://stackoverflow.com/a/14307116/576911 per i collegamenti a tali algoritmi. Ecco un link a un articolo con motivazione e un'implementazione parziale: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html#shared_mutex_imp –