c ++ 11 problemi di multithreading con Android where alcuni thread non sono pianificati correttamente

Sto sviluppando un'applicazione basata su VoIP che è multithreaded. Per each socket c'è un std::thread c ++ 11 std::thread (incluso SSL read & write). Il module di base per la comunicazione dati è in C ++ che viene chiamato tramite l'interface JNI.

La mia osservazione è che, una volta inizializzato l'applicazione dopo pochi secondi, alcuni thread che erano in esecuzione in precedenza normalmente non hanno il tempo di esecuzione. Se un determinato thread è in esecuzione, esso continua a funzionare per un periodo compreso tra 3-4 secondi e 30-40 secondi.

  • come mostrare la barra di avanzamento sul webview?
  • Come modificare la dimensione del carattere di text selezionato in edittext a runtime?
  • Come rimuovere l'applicazione dalla list delle applicazioni recenti?
  • RecyclerView GridLayoutManager: come rilevare automaticamente il numero di span?
  • Imansible ricreare la libreria chiave di debug mancante?
  • Includi Http-4.2.1 con Android App
  • Dopo aver riferito di cambiare la priorità thread nativo su Android , ho anche provato a cambiare il valore "bel" a -10 per tutti i thread, ma senza fortuna. Importnte notare che lo stesso codice C ++ funziona perfettamente per iOS.

    C'è un problema con la pianificazione del thread Android Native, o mi manca qualcosa?

  • Tenere il model TensorFlow crittografato su Android
  • Problema di prestazione dell'utilizzo del puntatore di stile Renderscript c
  • Enumerare / ingrandire tutte le viste in attività?
  • Errore di connessione ADB: Imansible creare il bridge di debug: Imansible avviare server adb: Imansible rilevare la versione adb, l'output di adb
  • L'icona di notifica diventa bianca in Marshmallow
  • Il field AndroidTextView SingleLine nasconde il text lungo
  • One Solution collect form web for “c ++ 11 problemi di multithreading con Android where alcuni thread non sono pianificati correttamente”

     while (...) { int selectResult = select( fd, ...); if ( selectResult > 0 ) DoSomeWork( fd ); else nanosleep(...); /* this is the new line which solved my stalling threads */ } 

    Ho avuto un problema simile, e ho scoperto che per il mio caso la soluzione era quella di verificare che quei thread che hanno un ciclo eterno (eseguendo costantemente select fino a quando non c'è qualcosa su una presa per generare un thread gestore), sempre call nanosleep alless una volta il loro ciclo.

    Come te, ho sperimentato questo problema su Android, e nessun problema su iOS.

    Posso solo ipotizzare che il JVM su Android a volte darebbe la priorità ad un thread che sta solo sondando un socket senza interrompere, in modo tale che altri thread che avessero fatto lavoro effettivo da fare fossero bloccati. Ma non saprei come verificare l'ipotesi.

    È anche strano che la mia soluzione funziona, dato che la selezione già utilizza un timeout scelto dall'utente, in modo tale da pensare che dorme internamente comunque. Apparentemente non su Android.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.