Ho due thread cercando di bloccare lo stesso boost::mutex
. Uno di questi thread elabora continuamente alcuni dati e l'altro visualizza periodicamente lo stato corrente. Il thread di elaborazione, secondo la mia intenzione, rilascia il blocco molto frequentemente e riacquisisce, in modo che il filo display può toccare e acquisire ogni volta ne ha bisogno. Quindi, ovviamente, mi piacerebbe che il thread di visualizzazione acquisisse il blocco la prossima volta che viene rilasciato dal thread di processo. Tuttavia, non lo fa, invece, attende il blocco e lo acquisisce solo dopo molti cicli di blocco dal thread del processo.blocco Acquisisci non appena è disponibile
Si prega di ispezionare l'esempio minimo che illustra il mio problema:
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
using namespace boost;
mutex mut;
void process() {
double start = time(0);
while(1) {
unique_lock<mutex> lock(mut);
this_thread::sleep(posix_time::milliseconds(10));
std::cout<<".";
if(time(0)>start+10) break;
}
}
int main() {
thread t(process);
while(!t.timed_join(posix_time::seconds(1))) {
posix_time::ptime mst1 = posix_time::microsec_clock::local_time();
cout<<endl<<"attempting to lock"<<endl;
cout.flush();
unique_lock<mutex> lock(mut);
posix_time::ptime mst2 = posix_time::microsec_clock::local_time();
posix_time::time_duration msdiff = mst2 - mst1;
cout << std::endl<<"acquired lock in: "<<msdiff.total_milliseconds() << endl;
cout.flush();
}
}
Compilato con: g++ mutextest.cpp -lboost_thread -pthread
Quando eseguo il file eseguibile, un esempio di output è come questo:
...................................................................................................
attempting to lock
....................................................................................................................................................................................................................................................................................................................................................................................................................................
acquired lock in: 4243
...................................................................................................
attempting to lock
........................................................................................................
acquired lock in: 1049
...................................................................................................
attempting to lock
........................................................................................................................
acquired lock in: 1211
....................................
Come si può vedere, nel peggiore dei casi, il thread del display attende 424 cicli di rilascio del blocco prima che torni a prendere il lucchetto.
Sono ovviamente utilizzando il mutex in modo sbagliato, ma qual è il solito modo per risolvere questo problema?
accanto soliti sospetti: (variabile di condizione, resa,) prova un contenitore sicuro per i thread ... – NoSenseEtAl