Hier ist die Szene: Ich versuche, einen einfachen Multi-Thread-Server mit Libev zu schreiben, und implementieren Sie das Thread-Pool-Modell, das Memcached verwendet, die einen Dispatcher-Thread und mehrere Worker-Threads verwendet (aber das Problem ist nicht über Libev oder memcached).Warum verursacht std :: queue.front() einen Segmentfehler?
definiere ich eine Klasse WorkerThreadPool
die wie
class WorkerThreadPool
{
//...
private:
WorkerThread *worker_threads; //worker threads, enough space allocated
};
und WorkerThread ist struct unten (weglassen einige unnötige Felder)
typedef struct {
thread_t tid;
std::queue<event_entry *> event_queue; //event_entry is irrelavant here
}WorkerThread;
Dann gibt es eine private static Memberfunktion eventHandler
in der Klasse WorkerThreadPool
, in dem ich auf eine der Threadstrukturen zugreife (alle Threads wurden erfolgreich erstellt), wie folgt
WorkerThread *wthread = &worker_threads[0];
if(whtread->event_queue.empty()){
std::cout << "Empty!\n";
}else{
std::cout << "Not empty.\n";
event_entry *evt = wthread->event_queue.front();
std::cout << "fine.\n";
}
Es stürzte jedoch direkt nach der Ausgabe "Not empty. \ N" ab, weil es nicht "in Ordnung. \ N" gedruckt wurde.
Zuerst dachte ich, es liegt daran, dass statische Member-Funktion nicht nicht-statische Member zugreifen können, aber , wenn ich die worker_threads
zu statisch ändern, wird der Fehler bleibt. Ich habe auch versucht, die worker_threads
zu ändern, um öffentlich zu sein, aber kein Glück.
Jetzt bin ich wirklich verwirrt und ich bin seit Tagen fest. Könnte mir jemand Hilfe geben?
Haben Sie sperren die Warteschlange mit so etwas wie ein Mutex vor dem Lesen und Schreiben? –
Möglicherweise nicht verwandt, aber seien Sie vorsichtig mit gepufferter Ausgabe als Debugging-Tool. Wenn der Ausgabepuffer nicht geleert wurde, ist es möglich, dass Ihr Programm nicht abgestürzt ist, wo Sie es dachten. Sie können diese Zeilenumbrüche durch 'std :: endl 'ersetzen, um sicherzustellen, dass die Ausgabe vor dem Absturz auf dem Bildschirm angezeigt wird. –
Bitte ** [bearbeiten] ** Ihre Frage mit einem [mcve] oder [SSCCE (kurz, unabhängig, korrektes Beispiel)] (http://sscce.org) – NathanOliver