2010-05-16 23 views
9

Boost konuları yerine benim uygulamamda C++ 0x iş parçacığı kullanmayı düşünüyorum. Ancak, ben bir interrupt() yöntemine sahip görünmüyor, çünkü standart C++ 0x iş parçacığı ile sahip olduğumu yeniden nasıl emin olacağından emin değilim.Bekleme C++ 0x iş parçacığı nasıl kesilir?

Benim şu anki kurgusunda:

  • işi yöneten bir usta iplik;
  • Master'ın komutlarını gerçekleştiren birkaç çalışan iş parçacığı.

İşçiler en az iki farklı koşul değişkeninde wait()'u arar. Üstadın bir “zaman aşımına uğradı” durumu vardır: bu durumda tüm işçilere durdukları ve o zamana kadar aldıkları sonucu vermelerini söyler. Boost konuları ile master, işçilerin beklemeyi durdurmasına neden olan bir iş parçacığı grubunda interrupt_all()'u kullanır. Şu anda beklemedikleri takdirde, usta ayrıca işçilerin periyodik olarak kontrol ettiği bir bool bayrağını da ayarlar.

Ancak, C++ 0x std::thread içinde interrupt() için herhangi bir yedek göremiyorum. Bir şey mi özledim? Eğer değilse, yukarıdaki şemayı nasıl uygulayabilirim ki, işçiler sonsuza dek uyuyamazlar mı?

cevap

9

Maalesef yoklama kullanmak yerine, bekleme süresi kullanmak ve kesinti yapıldığını bildirmek için bir değişken kullanmak yerine, başka bir yol görmüyorum. onlara sahip ve iki işlev kesme ve boole doğruysa ile interrupted_exception atmak check_interruption_point, eğer

void th(Interruptor& interruptor) { 
    try { 

    ... 

    while (cnd1.timed_wait(d)==false) { 
     interruptor.check_interruption_point(); 
    } 
    ... 
    } catch (interrupted_exception &) {} 
} 

Engelleyici sınıf bir mutex ile korunan veya atomik işlemleri kullanarak bir boolean değişkeni tutacaktır. Mater iş parçacığı, oluşturma aşamasında ilgili iş parçacığına verilecek bir Interruptor değişkeni oluşturacaktır. Master, bu kesiciye bağlı olan tüm dişleri bir kerede kesebilme olanağına sahiptir. Bir seferde bir iş parçacığını açıkça kesmek isterseniz, elbette her iş parçacığı için bir kesinti yaratabilirsiniz.

Süre beklemedeki süreyi tanımlamanız için size bağlı olarak, iş parçacığınız programınızın gerektirdiği anda tepki verebilir.

+0

Sanırım Boost iş parçacığı kullanmaya devam edeceğim. Onlar da arabası, ama en azından onlar için kararlı bir çözümüm var. – doublep

1

Ara artırmada kesinti(), bir iş parçacığının engellenmiş olduğu durumda bir notify_all yayımlamak için bekleyin ve sonra bir kesintinin istenip istenmediğini kontrol edin. Eğer bir kesinti istenirse, o zaman bir atlama desteği yapar: thread_interrupted. Mekanizma ile std :: thread'e göre kendi thread sınıfınızı yazabilirsiniz.

+2

Ve muhtemelen kendi koşul alt sınıfımı yazmam için iş parçacığının ne beklemesi gerektiğini biliyor mu? Bu bana biraz fazla iş gibi geliyor. – doublep

1

Gerçekten de, C++ 11 std :: thread bunun için standart bir mekanizma sunmuyor (henüz?). Bu yüzden ikinci @ doublep 'nin şu an için boost :: thread kullanma kararı aldım.

C++ 11 std :: facilities kullanmayı tercih ederiz. Ancak, herhangi bir nedenden ötürü, uykuyu kesmek için koşullu değişkenle dolu olan boost'un terminate() tesisini yeniden inşa etmek istemiyoruz. Böyle bir altyapı oluşturmak eğlenceli ve bu zor, ama verimsiz ve daha az destek kullanarak standart değil.

Bu, boost :: thread ve std :: thread'inin kendimizi bir köşeye boyamayacağımızı düşündüğümüz kadar benzer olmasına yardımcı olur. (Std :: thread'in nispeten kolay olması için belki de önemsiz olmasını bekliyoruz.)

İlgili konular