Indicizzazione di array c ++ con valore non const [duplicato]

Nov 09 2020

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

3 SamVarshavchik Nov 09 2020 at 22:03

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.