2017-02-06 1 views
-1

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

ist
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?

+0

Haben Sie sperren die Warteschlange mit so etwas wie ein Mutex vor dem Lesen und Schreiben? –

+0

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. –

+1

Bitte ** [bearbeiten] ** Ihre Frage mit einem [mcve] oder [SSCCE (kurz, unabhängig, korrektes Beispiel)] (http://sscce.org) – NathanOliver

Antwort

1
event_entry *evt = wthread->event_queue.front(); 

ist ein Problem, wenn die Warteschlange leer ist.

Sie müssen verwenden:

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"; 
+0

Hallo, danke für deine Antwort, aber eigentlich stürzte es sogar ab, es gibt "Not empty." Aus. Die Ausgabe davor ist nur um sicherzustellen, dass es nicht leer ist. Ich werde meine Frage so ändern, dass sie weniger verwirrend ist. –

Verwandte Themen