Ich habe zwei Threads versuchen, das gleiche zu sperren boost::mutex
. Einer dieser Threads verarbeitet fortlaufend Daten und der andere zeigt regelmäßig den aktuellen Status an. Der Verarbeitungsthread, entsprechend meiner Absicht, gibt das Schloss sehr häufig frei und nimmt es wieder auf, so dass der Anzeigethread es anzapfen und es bei Bedarf abrufen kann. Offensichtlich möchte ich, dass der Anzeige-Thread die Sperre annimmt, wenn er das nächste Mal vom Prozess-Thread freigegeben wird. Dies geschieht jedoch nicht, stattdessen wartet es auf die Sperre und erhält sie erst nach vielen Sperren-Freigabe-Zyklen vom Prozeß-Thread.Erwerben Sie Schloss, sobald es verfügbar ist
überprüfen Sie bitte die minimal Beispiel zeigt, mein Problem:
#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();
}
}
Zusammengestellt mit: g++ mutextest.cpp -lboost_thread -pthread
Wenn ich die ausführbare Datei ausführen, ein Beispiel für die Ausgabe ist wie folgt:
...................................................................................................
attempting to lock
....................................................................................................................................................................................................................................................................................................................................................................................................................................
acquired lock in: 4243
...................................................................................................
attempting to lock
........................................................................................................
acquired lock in: 1049
...................................................................................................
attempting to lock
........................................................................................................................
acquired lock in: 1211
....................................
Wie Sie kann sehen, im schlimmsten Fall wartet der Display-Thread auf 424 Lock-Release-Zyklen, bevor es darum geht, das Schloss zu fangen.
Ich benutze offensichtlich den Mutex auf eine falsche Art, aber was ist der übliche Weg, um das zu lösen?
neben üblichen Verdächtigen: (condition variable, yield,) probiere einen thread safe container ... – NoSenseEtAl