Sınıf yıkıcıdan bir deamon dizisini durdurmak için "uygun" yol

her şeyden önce "uygun" çünkü insanların bana bir dersten iplik çıkarmanın kötü bir uygulama olduğunu söyleyeceğini farz ediyorum. :) Bu yüzden bir yıkıcıda sonsuz bir iş parçacığını durdurmanın en iyi yolunun ne olduğunu merak ediyorum. Bayrak kapatma ayarlandığında, çağrıları iş parçacığı olarak işleyen ve istisna atan kaydırma işlevi? Sadece iyi eski int/enum? İyi yeni std :: atomik int? Başka bir şey? Şimdi kullanıyorum:

//in destructor I call terminate member func
void terminate()
{
    currentStatus=terminating;
    std::cout<<"trying to kill"<<<"MISSION ACOMPLISHED"<

Ve iş parçacığının çalıştırdığı işlev:

while (currentStatus==active)
{
//...
}
currentStatus=terminated;

currentStatus bir numaradır:

enum status{
    active,
    terminating,
    terminated
};
0

1 cevap

'İnsanların bana bir dersten iplik çıkarmanın kötü bir uygulama olduğunu söyleyeceğini farz ediyorum' - yine de değil. Eğer OO diliniz varsa, başka nereden başlatacaksınız :)

Verim() döngüsü ile ilgili bir sorun var. Yıkıcıyı çağıran iş parçacığı, sonlandırılan iş parçacığından daha yüksek bir önceliğe sahipse, tasarımınız tek işlemcili bir sistemde sonsuza kadar hareket edebilir. Çok çekirdekli bir sistemde bile uzun bir gecikme olabilir. İş parçacığı tanıtıcısında veya sonlandırıcı iş parçacığının çıkıştan önceki son eylemi olarak belirlediği bir olayda beklemek daha iyidir. Önlenebilir CPU döngüsünü ortadan kaldırmakla kalmaz, aynı zamanda açık engeller gerektirebilecek 'durum' emumu ile herhangi bir önbellekleme sorununu ortadan kaldırır.

Rgds, kırlangıç

1
katma