2013-03-05 24 views
7

ile başarısız Ben başarısız ve güvenli kapatma nedenleri hakkında bilgi sağlar, böylece, ana iş parçacığı için herhangi yakalanmamış iplik gelen istisnalar yaymak için gereken bir program var. Benim InterThreadException işleyici çalışmak ancak bir istisna atar iplik ana iş parçacığı tarafından doğrudan kökenli yalnızca görünüyor.std :: rethrow_exception iç içe parçacığı

InterTheadException işleyicisi geçirilen bir özel işaretçi olan bir istisna yayılır sinyallerini olan, her durumda doğru çağrılan ve ana dişli, yeni bir durum almış bildirim ancak std::rethrow_exception için aramayı kabul ederse istisna işaretçisi üzerinde sadece başarısız olur ve görünüşte hiçbir şey yapmaz. Bu iki farklı konudan aynı istisnayı fırlatmayı test ettim ve sorun ne attığım önemli değil.

ben bir istisna işaretçileri kullanmak gerekiyordu nasıl temel bir yanlış anlama var sanıyorum, ama emin değilim.

İşte InterThreadExceptionHandler benim uygulamasıdır.

class InterThreadExceptionHandler : NonCopyable 
{ 
public: 
    InterThreadExceptionHandler(); 
    ~InterThreadExceptionHandler(); 

    // 
    // Sends an exception into this handler, informing it that 
    //this exception has been caught 
    // and may be propagated to another thread 
    // 
    void sendException(std::exception_ptr exception); 

    // 
    // Freezes the calling thread until an exception has been sent, 
    //then rethrows said exception 
    // 
    void waitForException(); 

private: 
    std::vector<std::exception_ptr> sentExceptions; 
    std::mutex sentExceptionsMutex; 

    Semaphore sentExceptionsCounter; 
}; 


InterThreadExceptionHandler::InterThreadExceptionHandler() 
{ 
} 
InterThreadExceptionHandler::~InterThreadExceptionHandler() 
{ 
} 

void InterThreadExceptionHandler::sendException(std::exception_ptr exception) 
{ 
    ScopedLock lock(this->sentExceptionsMutex); 
    this->sentExceptions.push_back(exception); 
    this->sentExceptionsCounter.give(); 
} 

void InterThreadExceptionHandler::waitForException() 
{ 
    this->sentExceptionsCounter.take(); 
    ScopedLock lock(this->sentExceptionsMutex); 

    assert(this->sentExceptions.size() > 0); 

    std::exception_ptr e = this->sentExceptions[0]; 
    this->sentExceptions.erase(this->sentExceptions.begin()); 
    if (e == std::exception_ptr()) 
    { 
     throw std::exception("Invalid exception propagated!"); 
    } 
    std::rethrow_exception(e); 
} 
+1

http://stackoverflow.com/questions/233127/how-can-i-propagate-exceptions-between-threads adresinin olası kopyası – engineerC

+3

Sınıfınız GNU/Linux üzerinde GCC ile iyi çalışıyor (count count() işlevini değiştirdikten sonra boyut() 've standart dışı' std çağrıyı değişen :: exception' yapıcı ve değiştirme 'için' 'std :: condition_variable') ile Semaphore' yüzden bir MSVC hata gibi geliyor. Bir iş parçacığının "ana" iş parçacığı mı yoksa başka bir iş parçacığı tarafından mı ortaya çıktığı önemli değil. –

+0

vs2013 üzerinde çalışıyor mu? –

cevap

0

Sorunuz için doğrudan bir yanıt olmamak için özür dileriz, ancak yine de yararlı olabilir. Bir iş parçacığı ya vs, bir istisna yakalamak bir dönüş kodu kontrol ederek çalışma zamanı hatası tespit ederse

, o iplik tüm süreci dondurmak var. Ben de alabilirim herhangi iz günlükleri sorununa kadar kurşun için korunur, böylece (dtrace bir Linux klonu) ftracing kapatmak zorunda kalacak. Korkarım ki Windows eşdeğerinin ne olduğunu bilmiyorum. Sonra bir hata ayklayc ve, neler olup bittiğini görmek için belki de bir değeri düzeltip yürütme taşımak için etrafına bir göz alabilir.

O konuşlandırılmış kodunda için kullanışlı değildir ama gelişimi sırasında harika. 'Olduğu gibi' her şey var çünkü bir sorun vardır görünümü, diğer ipler arıza tespiti kolaylaştırabilir yere ulaşmak için bir şans, vb pek olmadı hiçbir yığın gevşemek var oldu, iyidir. Dağıtılmış kod için bir çekirdek dökümü (unixy üzerinde çalışıyorum) yerine provoke edebilirim. Tabii ki bir dereceye kadar temizlik gerekli ise bu iyi değil.