Indicizzazione di array c ++ con valore non const [duplicato]
Ho il codice seguente:
DisplayObject conveyor_belts[] = {eggs_1, eggs_2, flour_1, flour_2, sugar_1, sugar_2, butter_1, butter_2};
std::thread conveyor_belts_t[4];
for (int j = 0; j < 4; j++) {
conveyor_belts_t[j] = std::thread([&](){
conveyor_belts[j * 2].draw(15, 78 + i * 3); // segmentation fault here
});
}
Ho definito un costruttore di copia per displayObject, ma il codice sopra mi dà un errore di segmentazione nella riga evidenziata. Posso risolvere questo problema nel modo seguente:
DisplayObject conveyor_belts[] = {eggs_1, eggs_2, flour_1, flour_2, sugar_1, sugar_2, butter_1, butter_2};
std::thread conveyor_belts_t[4];
for (int j = 0; j < 4; j++) {
conveyor_belts_t[j] = std::thread([&](){
conveyor_belts[0].draw(15, 78 + i * 3);
});
}
Mi chiedo perché un'indicizzazione variabile mi darà un errore di segmentazione
Risposte
Nel tuo thread di esecuzione
conveyor_belts[j * 2].draw(15, 78 + i * 3);
C ++ non offre alcuna garanzia che il nuovo thread di esecuzione eseguirà questo codice e leggerà il valore jche è stato catturato per riferimento prima che il thread di esecuzione originale iteri il forciclo e incrementi il valore di jriferimento qui. Tutto ciò che C ++ ti garantisce è che il nuovo thread di esecuzione inizierà ad essere eseguito a un certo punto dopo essere stato std::thread costruito. Questa è la tua unica garanzia.
È abbastanza probabile che nel momento in cui tutti i thread di esecuzione risvegliano il forciclo già terminato l'iterazione, e tutti e quattro i thread di esecuzione stanno guardando felicemente il loro riferimento catturato j, che ora ha raggiunto il suo valore finale di 4, e tutti e quattro i thread di esecuzione saranno felici usa il valore di j, che è adesso 4, perché è stato acquisito per riferimento.