Sto giocando con alcuni socket, thread e mutex. La mia domanda riguarda fili e mutex:Lo sblocco di mutex fallisce in modo strano
int ConnectionHandler::addNewSocket(){
this->connectionList_mutex.lock();
std::cout << "test1" << std::endl;
this->connectionList_mutex.unlock();
return 0;
}
int ConnectionHandler::main(){
while(true){
this->connectionList_mutex.lock();
std::cout << "test2" << std::endl;
this->connectionList_mutex.unlock();
}
}`
La funzione principale è in esecuzione in un thread, mentre l'addNewSocket viene chiamato da un altro thread. Il problema è che, quando addNewSocket viene chiamato una volta (dal secondo thread), lo sblocco successivo da parte di thread 1 (main) fallirà con uno strano "SIGABRT di segnale". Ho lavorato due giorni su questo ora, ma non sono riuscito a farlo riparare, purtroppo. Spero che puoi aiutarmi.
Modifica: ConnectionHandler è una classe che ha connectionList_mutex come membro.
Modifica: A volte viene visualizzato anche questo errore: "Asserzione non riuscita: (ec == 0), funzione sblocco, file /SourceCache/libcxx/libcxx-65.1/src/mutex.cpp, riga 44." ma si verifica casualmente.
Modifica: Questa è l'intera classe (Ridotta al minimo, dovrebbe essere indipendente dal contesto in una certa misura, ma si blocca quando la inserisco subito dopo un client collegato e funziona se la metto subito dopo l'avvio:
..class ConnectionHandler{
public:
ConnectionHandler();
int addNewSocket();
private:
int main();
static void start(void * pThis);
std::mutex connectionList_mutex;
};
ConnectionHandler::ConnectionHandler(){
std::thread t(&this->start, this);
t.detach();
}
void ConnectionHandler::start(void * pThis){
ConnectionHandler *handlerThis;
handlerThis = (ConnectionHandler *)pThis;
handlerThis->main();
}
int ConnectionHandler::addNewSocket(){
this->connectionList_mutex.lock();
std::cout << "test1" << std::endl;
this->connectionList_mutex.unlock();
return 0;
}
int ConnectionHandler::main(){
while(true){
this->connectionList_mutex.lock();
std::cout << "test2" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
this->connectionList_mutex.unlock();
}
}
Perché tag std? Il tuo mutex std :: mutex o qualcosa del genere? –
sì il mutex e il thread sono entrambi C++ 11 std – sh4kesbeer
ok, forse sono stupido, ma ora (ho creato un piccolo codice) che funziona, devo solo capire, perché non funziona nel contesto del mio vero programma – sh4kesbeer