c ++ pengindeksan array dengan nilai non-const [duplikat]
Saya memiliki kode berikut:
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
});
}
Saya mendefinisikan konstruktor salinan untuk displayObject, tetapi kode di atas memberi saya kesalahan segmentasi pada baris yang disorot. Saya dapat mengatasi masalah ini dengan cara berikut:
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);
});
}
Saya bertanya-tanya mengapa pengindeksan variabel akan memberi saya kesalahan segmentasi
Jawaban
Di utas eksekusi Anda
conveyor_belts[j * 2].draw(15, 78 + i * 3);
C ++ tidak memberi Anda jaminan apa pun bahwa utas eksekusi baru akan mengeksekusi kode ini dan membaca nilai jyang ditangkap oleh referensi sebelum utas eksekusi asli mengulang forperulangan dan menambah nilai jyang direferensikan di sini. Semua yang dijamin C ++ kepada Anda adalah bahwa thread eksekusi baru mulai dijalankan di beberapa titik setelah std::thread dibuat. Itulah satu-satunya jaminan Anda.
Sangat mungkin bahwa pada saat semua utas eksekusi membangunkan forloop sudah selesai iterasi, dan keempat utas eksekusi dengan senang hati melihat referensi yang ditangkap j, yang sekarang telah mencapai nilai akhirnya 4, dan keempat utas eksekusi akan senang gunakan nilai j, yang sekarang 4, karena nilai diambil dengan referensi.