2016-04-13 108 views
1

Görevim, işlemlerin yürütülmesi ilkesini benimsememi gerektirir.Proses işlemenin kapsüllenmesi problem yaratır

İşte benim Process sınıf içerir budur:

class Process 
{ 
public: 
    Process(); 
    ~Process(); 

    pid_t getPid() const; 

private: 
    pid_t   pid_; 
}; 

Oluşturucu:

Process::Process() 
{ 
    this->pid_ = fork(); 
} 

Yıkıcı: Burada

Process::~Process() 
{ 
    if (this->pid_ > 0) 
    kill(this->pid_, SIGKILL); 
} 

sorun şu: enkapsüle ve bu tür benzeri bir nesne oluşturduktan sonra:

void example() 
{ 
    Process  pro; 

    if (pro.pid_ == 0) 
    { 
     // Child Process                          
    } 
    else if (pro.pid_ < 0) 
    { 
     // Error                           
    } 
    else 
    { 
     // Parent Process                          
    } 
} 

Programım hiçbir zaman çocuk koduna girmez, ancak normalde fork() (kapsülleme olmadan) bir çekicilik gibi çalışır.

Nerede hata yaptım?

cevap

0

Bu, race condition gibi görünür. Sizin durumunuzda ebeveynin çoğu zaman çocuğu, ondan beklediğiniz şeyi yapmadan önce öldürür. İki süreç arasında senkronizasyon olmadan, herhangi bir yürütme sırası mümkündür. Çocuğun her zaman iş yapmasını istiyorsanız, bir tür senkronizasyon gerçekleştirmelisiniz. Ortak bir kesmek (yani gerçekten senkronizasyon değil) ebeveynte [sleep][2]()'dir. Çocuğun tamamlanması için ebeveynde [wait][2]() çok yaygındır.

+0

İlginç! Fakat bu konuyla ilgili başka bir yol, algoritmamı bozacak bir uyku veya bekleyişten başka bir şey var mı? Cevabınız için teşekkür ederim. –

+0

Daha birçok senkronizasyon yöntemi var, Senkronizasyonun bir yolu iletişim kullanıyor, örn. borular, dosyalar, Başka bir yol, özellikle senkronizasyon için yapılan yapıları kullanmaktır, örn. semaphores veya bekleyin. En iyi olanı seçmek için yeterli problemi bilmiyorum, –

+0

Atamadan bahsettiğimden kesinlikle İsim Verilmiş Borular kullanacağım. Yardımın için çok teşekkürler. –