>백엔드 개발 >C++ >크로스 스레드 C++ 예외를 처리하는 방법은 무엇입니까?

크로스 스레드 C++ 예외를 처리하는 방법은 무엇입니까?

WBOY
WBOY원래의
2024-06-06 10:44:58777검색

멀티 스레드 C++에서 예외 처리는 std::promise 및 std::future 메커니즘을 통해 구현됩니다. Promise 개체를 사용하여 예외를 발생시키는 스레드에 예외를 기록합니다. 예외를 수신하는 스레드에서 예외를 확인하려면 future 객체를 사용하세요. 실제 예제에서는 Promise와 Future를 사용하여 다양한 스레드에서 예외를 포착하고 처리하는 방법을 보여줍니다.

크로스 스레드 C++ 예외를 처리하는 방법은 무엇입니까?

크로스 스레드 C++ 예외를 처리하는 방법

머리말

멀티 스레드 프로그래밍에서는 모든 스레드에서 예외가 발생할 수 있습니다. 스레드 전체에서 예외를 처리하려면 예외가 발생하는 방법과 위치에 대한 명시적인 제어가 없기 때문에 추가 고려 사항이 필요합니다.

예외 전달 메커니즘

C++ 표준 라이브러리는 std::promisestd::future라는 예외 전달 메커니즘을 제공합니다. 이를 사용하여 스레드 간에 예외를 안전하게 전달할 수 있습니다. std::promisestd::future。我们可以使用它们来安全地在线程之间传递异常。

std::promise 负责生成异常,而 std::future 负责接收异常。两个对象必须在同一个线程中创建:

// 在主线程创建
std::promise<void> promise;
std::future<void> future = promise.get_future();

当异常在其他线程中抛出时,我们可以使用 promise 对象将其传递:

// 在 worker 线程
try {
  // ... 代码可能会抛出异常
}
catch (const std::exception& e) {
  promise.set_exception(std::make_exception_ptr(e));
}

然后,可以在主线程中使用 future 对象来检查异常:

// 在主线程
try {
  future.get();
}
catch (const std::exception& e) {
  // 处理异常
}

实战案例

以下代码展示了如何使用 std::promisestd::future 来处理跨线程异常:

#include <iostream>
#include <future>
#include <thread>

// 打印函数以展示在不同线程中抛出的异常
void printFunction() {
  try {
    throw std::runtime_error("这是一个运行时错误!");
  }
  catch (const std::exception& e) {
    std::cerr << "Worker 线程捕获异常:" << e.what() << '\n';
  }
}

int main() {
  std::promise<void> promise;
  std::future<void> future = promise.get_future();

  // 在新线程中运行打印函数
  std::thread worker(printFunction);

  // 让主线程等待 worker 线程
  try {
    future.get();
  }
  catch (const std::exception& e) {
    std::cerr << "主线程捕获异常:" << e.what() << '\n';
  }

  worker.join();
  return 0;
}

结论

通过使用 std::promisestd::future

std::promise는 예외 생성을 담당하고, std::future는 예외 수신을 담당합니다. 두 개체는 모두 동일한 스레드에서 생성되어야 합니다. 🎜rrreee🎜 다른 스레드에서 예외가 발생하면 promise 개체를 사용하여 이를 전달할 수 있습니다. 🎜rrreee🎜 그런 다음 메인 스레드 future 객체를 사용하여 예외 확인: 🎜rrreee🎜실용 사례🎜🎜다음 코드는 std::promisestd::future를 사용하는 방법을 보여줍니다. 크로스 스레드 예외를 처리하려면: 🎜rrreee🎜Conclusion🎜🎜 std::promisestd::future를 사용하면 크로스 스레드를 안전하게 처리할 수 있습니다. 예외. 이를 통해 예외가 발생한 후에도 실행을 계속하고 나중에 처리할 수 있습니다. 🎜

위 내용은 크로스 스레드 C++ 예외를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.