Il mio scenario: un server e alcuni client (anche se non molti). Il server può rispondere solo a un client alla volta, quindi devono essere messi in coda. Sto usando un mutex (boost::interprocess::interprocess_mutex
) per fare questo, avvolto in un boost::interprocess::scoped_lock
.Come assumere la proprietà di un boost abbandonato :: interprocess :: interprocess_mutex?
Il problema è che se un client muore in modo imprevisto (cioè non esegue il distruttore) mentre tiene il mutex, gli altri client sono in difficoltà, perché stanno aspettando quel mutex. Ho preso in considerazione l'utilizzo di attesa temporizzata, quindi se il client aspetta, diciamo, 20 secondi e non ottiene il mutex, va avanti e parla comunque al server.
Problemi con questo approccio: 1) lo fa ogni volta. Se si trova in un ciclo, parlando costantemente al server, è necessario attendere il timeout ogni volta. 2) Se ci sono tre client, e uno di loro muore tenendo premuto il mutex, gli altri due attenderanno solo 20 secondi e parleranno allo stesso tempo al server - esattamente quello che stavo cercando di evitare.
Quindi, come posso dire a un cliente, "ehi, sembra che questo mutex sia stato abbandonato, prendine possesso di esso"?
Se si sta facendo affidamento sui client per eseguire la sincronizzazione, lo si sta facendo all'indietro. Dovresti davvero aggiustare il tuo server in modo che possa accettare più connessioni, anche se fa in modo che le altre connessioni rimangano in attesa mentre serve una alla volta. Ciò ti consente di prendere la parte * interprocess * dall'equazione. –
Punto giusto. Tuttavia, la mia applicazione è stata originariamente specificata per avere un solo cliente alla volta - solo recentemente (come oggi) ho scoperto che potrebbero esserci più client. Ho cercato di risolverlo nel modo più semplice, ma suppongo che dovrò inventare qualcosa di più sofisticato. –
Sembra che l'intero meccanismo del mutex sia difettoso senza un meccanismo di recupero. Wish Boost risolve questo problema. – balki