Hiçbir zaman geçerli bir C ++ programını sonlandırmaz mı?


15

Bir programın sonlanması gerekiyor mu? Diğer bir deyişle, teknik olarak Tanımsız Davranış sonsuza dek çalışan bir program mı? Bunun boş döngülerle ilgili olmadığını unutmayın. Sonsuza kadar "şeyler" (yani gözlemlenebilir davranış) yapan programlar hakkında konuşmak.

Örneğin böyle bir şey:

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
        }
    }
}

Bu daha akademik bir sorudur, çünkü ampirik olarak tüm aklı derleyiciler yukarıdaki program için beklenen kodu üretecektir (elbette başka bir UB kaynağı olmadığı varsayılarak). Ve evet, elbette hiç bitmeyen bir çok program var (os, gömülü, sunucular). Ancak standart bazen tuhaf, bu nedenle soru.


Teğetsel: "algoritma" nın birçok (bazı?) Tanımı, bir algoritmanın sonlandırılmasını gerektirir , yani hiçbir zaman sonlandırmayan bir dizi işlem bir algoritma olarak kabul edilmez.


Teğet. Durma problemi, bir girdi için rasgele bir programın tamamlanıp tamamlanmadığını belirlemek için bir algoritma bulunamayacağını belirtir. Ancak bu özel program için ana hattan çıkmaya yol açan bir dal olmadığından, derleyici programın hiç bitmeyeceğini kolayca belirleyebilir. Ancak soru dil-avukat olduğu için bu konuyla ilgisizdir.


Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
Samuel Liew

Yanıtlar:


15

C ++ standardında, programın veya belirli bir iş parçacığının sonlandırılmasını gerektiren hiçbir şey yoktur. Buna en yakın şey [intro.progress] p1 diyor

Uygulama, herhangi bir iş parçacığının sonunda aşağıdakilerden birini yapacağını varsayabilir:

  • sonlandırmak
  • kütüphane G / Ç işlevini arama,
  • uçucu bir glvalue üzerinden erişim gerçekleştirmek veya
  • bir senkronizasyon işlemi veya bir atomik işlem gerçekleştirin.

[  Not: Bu, sonlandırma kanıtlanamamış olsa bile, boş döngülerin kaldırılması gibi derleyici dönüşümlerine izin vermek için tasarlanmıştır. -  son not  ]

Sürece olmadığı için bazı gözlemlenebilir davranış, sonunda, ya sürece bir G / Ç işlemi veya başka engelleme kütüphane çağrı bloke tüm zaman harcıyor gibi bu geçerli değildir ve program (tüm karşılayan geçerli üstleniyor diğer geçerlilik kriterleri).


"bir G / Ç işlemi veya başka bir engelleme kitaplığı çağrısı" - Standart oldukça açıktır ve yalnızca G / Ç işlemlerini listeler. Neden "veya başka bir engelleme kitaplığı çağrısı" ekliyorsunuz? Ayrıca, G / Ç işlemi, daha önceki " bazı gözlemlenebilir davranışlarınıza" zaten dahil edilmiştir .
MSalters

1
@ MSalters std::mutex::lock(), dördüncü madde işaretinin altına giren bir senkronizasyon işlemi olan kütüphane çağrısıdır. Bu nedenle, yalnızca G / Ç çağrılarından bahsedildiği doğru değildir.
Igor Tandetnik

Eğer girdiye takılı kalırsa , ancak hiçbir zaman elde edilmezse , bunun gözlemlenebilir olarak sayılması tartışmalıdır.
Daniel H

4

Evet. itibaren[intro.progress]

Uygulama, herhangi bir iş parçacığının sonunda aşağıdakilerden birini yapacağını varsayabilir:

  • sonlandırmak
  • kütüphane G / Ç işlevini arama,
  • uçucu bir glvalue üzerinden erişim gerçekleştirmek veya
  • bir senkronizasyon işlemi veya bir atomik işlem gerçekleştirin.

[ Not: Bu, sonlandırma kanıtlanamamış olsa bile, boş döngülerin kaldırılması gibi derleyici dönüşümlerine izin vermek için tasarlanmıştır. - son not ]


Programın G / Ç'nin tavsiye edilebileceğini belirten küçük bir açıklama olduğuna inanıyorum.
KamilCuk

Bu nedenle , OPs örneğindeki get_inputve put_outputişlevleri "bir kütüphane G / Ç işlevine çağrı yapın" sürece program, sonlandırılmasa bile geçerli olmalıdır?
Bazı programcı ahbap

@Someprogrammerdude veya değişken veya atomik bir değere erişin, Evet
Caleth

mevcut bellek modeli olmadığında, c ++ 11 öncesi standardını merak ediyorum.
bolov

1
compiler does not know- Bu alakasız. Derleyici dil katmanı açısından bilebilir ve bilmeyebilir - soru her durumda geçerli olup olmadığıdır.
KamilCuk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.