Propagando exceções entre threads em C
A tarefa de propagar exceções entre threads em C surge quando uma função chamada de um thread principal gera vários threads de trabalho para trabalho com uso intensivo de CPU. O desafio está em lidar com exceções que podem ocorrer nos threads de trabalho e propagá-las de volta ao thread principal para o tratamento adequado.
Abordagem Convencional
Uma abordagem comum é capturar manualmente uma variedade de exceções em threads de trabalho, registrar seus detalhes e relança-los no thread principal. No entanto, este método tem uma limitação: suporta apenas um conjunto fixo de tipos de exceção. Quaisquer novos tipos de exceção introduzidos no futuro exigiriam modificação manual no código.
C 11 Exception Handling
C 11 introduz o tipo exception_ptr, fornecendo uma solução mais robusta para propagação de exceção. Este tipo permite o transporte de exceções entre threads.
Exemplo de implementação
O exemplo a seguir demonstra como propagar exceções usando exceção_ptr:
#include
#include
#include
#include
static std::exception_ptr eptr;
void worker() {
try {
// Simulated CPU-intensive work with a delay
std::this_thread::sleep_for(std::chrono::seconds(1));
throw std::runtime_error("Exception in worker thread");
} catch (...) {
eptr = std::current_exception();
}
}
int main() {
// Create a worker thread
std::thread workerThread(worker);
workerThread.join();
// Check if an exception occurred on the worker thread
if (eptr) {
try {
// Rethrow the exception on the main thread
std::rethrow_exception(eptr);
} catch (const std::exception &ex) {
// Handle the exception on the main thread
std::cerr Neste exemplo, o thread de trabalho captura qualquer exceção que ocorre e a atribui ao eptr. No thread principal, o eptr é verificado e, se uma exceção estiver presente, ele é lançado novamente.
Nota para vários threads de trabalho
Se você tiver vários threads de trabalho , você precisará manter instâncias de exceção_ptr separadas para cada thread para capturar possíveis exceções.
Considerações Adicionais
- exception_ptr é um tipo semelhante a um ponteiro compartilhado, portanto, é crucial garantir que pelo menos um exceção_ptr esteja apontando para cada exceção para evitar que sejam lançadas.
- Específico da Microsoft: ao usar exceções SEH com o sinalizador do compilador /EHa, o código de exemplo também pode capturar Exceções SEH, como violações de acesso. Isso pode não ser desejável em todos os casos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3