Stavo controllando la libreria boost (versione 1.45) per un blocco lettore/scrittore. Quando ho eseguito i miei test su di esso, sembrava che il parametro shared_ptr preferisse i thread del mio lettore, cioè quando il mio writer ha provato a prendere il lock per la sua operazione, non ha impedito l'esecuzione di successive letture.Boost shared_lock. Leggere preferito?
E 'possibile in boost modificare questo comportamento?
using namespace std;
using namespace boost;
mutex outLock;
shared_mutex workerAccess;
bool shouldIWork = true;
class WorkerKiller
{
public:
void operator()()
{
upgrade_lock<shared_mutex> lock(workerAccess);
upgrade_to_unique_lock<shared_mutex> uniqueLock(lock);
cout << "Grabbed exclusive lock, killing system" << endl;
sleep(2);
shouldIWork = false;
cout << "KILLING ALL WORK" << endl;
}
private:
};
class Worker
{
public:
Worker()
{
}
void operator()()
{
shared_lock<shared_mutex> lock(workerAccess);
if (!shouldIWork) {
outLock.lock();
cout << "Workers are on strike. This worker refuses to work" << endl;
outLock.unlock();
} else {
sleep(1);
outLock.lock();
cout << "Worked finished her work" << endl;
outLock.unlock();
}
}
};
int main(int argc, char* argv[])
{
Worker w1;
Worker w2;
Worker w3;
Worker w4;
WorkerKiller wk;
boost::thread workerThread1(w1);
boost::thread workerThread2(w2);
boost::thread workerKillerThread(wk);
boost::thread workerThread3(w3);
boost::thread workerThread4(w4);
workerThread1.join();
workerThread2.join();
workerKillerThread.join();
workerThread3.join();
return 0;
}
Ed ecco l'output ogni volta:
lavorato finito il suo lavoro
lavorato finito il suo lavoro
lavorato finito il suo lavoro
lavorato finito il suo lavoro
Afferrato blocco esclusivo, uccidendo system
KILLING ALL WORK
mia esigenza
Se lo scrittore ha cercato di afferrare un blocco esclusivo, vorrei per tutte le operazioni di lettura precedenti per finire. E poi tutte le successive operazioni di lettura da bloccare.
Si potrebbe voler inviare un po 'di codice di prova - le mie capacità di debug psichici sono :-) deboli – Bukes