Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengendalikan pengecualian C++ silang silang?

Bagaimana untuk mengendalikan pengecualian C++ silang silang?

WBOY
WBOYasal
2024-06-06 10:44:58732semak imbas

Dalam C++ berbilang benang, pengendalian pengecualian dilaksanakan melalui mekanisme std::promise dan std::future: gunakan objek promise untuk merekodkan pengecualian dalam urutan yang membuang pengecualian. Gunakan objek masa hadapan untuk menyemak pengecualian dalam urutan yang menerima pengecualian. Contoh praktikal menunjukkan cara menggunakan janji dan niaga hadapan untuk menangkap dan mengendalikan pengecualian dalam urutan yang berbeza. . Mengendalikan pengecualian merentas urutan memerlukan pertimbangan tambahan kerana tiada kawalan eksplisit ke atas cara dan tempat pengecualian dilemparkan.

Mekanisme penghantaran pengecualianBagaimana untuk mengendalikan pengecualian C++ silang silang?

Pustaka standard C++ menyediakan mekanisme untuk menyampaikan pengecualian, dipanggil std::promise dan std::future. Kita boleh menggunakannya untuk menghantar pengecualian antara urutan dengan selamat.

std::promise bertanggungjawab untuk menjana pengecualian dan std::future bertanggungjawab untuk menerima pengecualian. Kedua-dua objek mesti dibuat dalam urutan yang sama:

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

Apabila pengecualian dilemparkan dalam utas lain, kita boleh menggunakan objek promise untuk menghantarnya:

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

Kemudian, kita boleh menghantarnya dalam utas utama Gunakan objek masa hadapan untuk menyemak pengecualian:

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

Kes praktikal

std::promisestd::future。我们可以使用它们来安全地在线程之间传递异常。

std::promise 负责生成异常,而 std::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;
}

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

rrreee

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

rrreee

实战案例

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

rrreee

结论

通过使用 std::promisestd::futureKod berikut menunjukkan cara menggunakan std::promise dan std::future Untuk mengendalikan pengecualian silang benang:

rrreee🎜Kesimpulan🎜🎜Dengan menggunakan std::promise dan std::future, kami boleh mengendalikan silang silang dengan selamat pengecualian. Ini membolehkan kami meneruskan pelaksanaan selepas pengecualian berlaku dan mengendalikannya kemudian. 🎜

Atas ialah kandungan terperinci Bagaimana untuk mengendalikan pengecualian C++ silang silang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn