Estaba revisando la biblioteca de impulso (versión 1.45) para un bloqueo de lector/escritor. Cuando ejecuté mis pruebas en él, parecía que shared_ptr prefería mis hilos de lectura, es decir, cuando mi escritor intentó tomar el bloqueo para su operación, no impidió que ocurriera ninguna lectura posterior.Boost shared_lock. Leer preferido?
¿Es posible en el impulso para cambiar este comportamiento?
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;
}
Y aquí es la salida cada vez que:
trabajado terminado su trabajo
trabajado terminado su trabajo
trabajado terminado su trabajo
trabajado terminado su trabajo
Grabbed bloqueo exclusivo, matando sistema
KILLING ALL WORK
Mi Requisito
Si el escritor trató de agarrar un bloqueo exclusivo, me gustaría que todas las operaciones de lectura anterior hasta terminar. Y luego todas las operaciones de lectura subsecuentes para bloquear.
Es posible que desee publicar una parte de código de prueba - mis habilidades psíquicas de depuración son débiles :-) – Bukes