Apakah program wajib diberhentikan? Dengan kata lain, apakah ada program yang berjalan selamanya, perilaku yang secara teknis tidak terdefinisi? Perhatikan ini bukan tentang loop kosong. Berbicara tentang program yang melakukan "hal-hal" (yaitu perilaku yang dapat diamati) selamanya.
Misalnya sesuatu seperti ini:
int main()
{
while (true)
{
try
{
get_input(); // calls IO
process();
put_output(); // calls IO, has observable behavior
// never break, exit, terminate, etc
} catch(...)
{
// ignore all exceptions
// don't (re)throw
// never go out of loop
}
}
}
Ini lebih merupakan pertanyaan akademis, karena secara empiris semua penyusun waras akan menghasilkan kode yang diharapkan untuk jenis program di atas (dengan asumsi tentu saja tidak ada sumber lain dari UB). Dan ya, tentu saja ada banyak program yang tidak pernah berakhir (os, embeded, server). Namun standar kadang-kadang unik, jadi pertanyaannya.
Tangensial: banyak (beberapa?) Definisi "algoritma" mensyaratkan algoritma harus diakhiri , yaitu serangkaian operasi yang tidak pernah berakhir tidak dianggap sebagai algoritma.
Tangensial. Masalah penghentian menyatakan bahwa tidak ada algoritma untuk menentukan apakah program arbitrer selesai untuk input. Namun untuk program khusus ini karena tidak ada cabang yang mengarah keluar dari utama, kompiler dapat dengan mudah menentukan program tidak akan pernah berakhir. Namun ini tidak relevan karena pertanyaannya adalah pengacara bahasa.
Jawaban:
Tidak ada dalam standar C ++ yang mengharuskan program, atau utas apa pun, untuk diakhiri. Hal terdekat dari itu adalah [intro.progress] p1 , yang mengatakan
Selama ada beberapa perilaku yang dapat diamati, pada akhirnya, atau selama ia menghabiskan seluruh waktunya diblokir pada operasi I / O atau panggilan pustaka pemblokiran lainnya, ini tidak berlaku, dan program tersebut valid (dengan asumsi ia memenuhi semua kriteria validitas lainnya).
sumber
std::mutex::lock()
adalah panggilan perpustakaan yang merupakan operasi sinkronisasi, berada di bawah peluru keempat. Jadi tidak benar bahwa hanya panggilan I / O yang disebutkan.Iya. Dari
[intro.progress]
sumber
get_input
danput_output
fungsi dalam contoh OP "membuat panggilan ke fungsi I / O perpustakaan" program harus valid bahkan jika itu tidak berakhir?compiler does not know
- Ini tidak relevan. Kompiler mungkin tahu dan mungkin tidak tahu, dari sudut pandang lapisan bahasa - pertanyaannya adalah apakah valid, dalam hal apa pun.