c++11 快速退出

C++程序中有以下几种推出方式:terminate abort exit

terminate: 实际上是c++语言中异常处理的一部分(包含在<exception>头文件中),一般而言,没有被捕获的异常就会被terminate函数调用。只要c++程序中出现了非程序员预期的行为,都有可能导致terminate的调用。而terminate函数在默认情况下,是去调用abort函数的。

abort:不会调用任何的析构函数,默认情况下会想合乎POSIX标准的系统抛出一个信号:SIGABRT。abort是系统在毫无办法的下下策——终止进程。会造成一些问题:

exit:属于正常退出的范畴。

#include <cstdlib>
#include <iostream>
using namespace std;

void openDevice() {
  cout << "device is opened. " << endl;
}

void resetDeviceStat() {
  cout << "device stat is reset. " << endl;
}

void closeDevice() {
  cout << "device is closed. " << endl;
}

int main() {
  atexit(closeDevice);
  atexit(resetDeviceStat);
  openDevice();
  exit(0);
}

输出为:

device is opened.

device stat is reset.

device is closed.

在程序退出时,所注册的函数都被调用,注册函数调用的次序与其注册顺序相反。

main或者exit函数调用会导致类的析构函数依次将这些零散的内存还给系统,这是一件费时的工作。而实际上,这些堆内存在进程结束的时候由操作系统统一回收(事实上,这非常快,操作系统除了释放一些进程相关的数据结构外,只是将一些物理内存标记为未使用就可以了),如果这些堆内存不对其他应用程序产生影响,那么在程序结束时释放往往是毫无意义的。

在c++11中,标准引入了quick_exit函数,该函数并不执行析构函数而只是使程序终止。quick_exit与exit同属于正常退出。

#include <cstdlib>
#include <iostream>
using namespace std;

struct A {
  ~A() {
    cout << "Destructor A. " << endl;
  }
};

void closeDevice() {
  cout << "device is closed" << endl;
}

int main() {
  A a;
  at_quick_exit(closeDevice);
  quick_exit();
}

输出为:

device is closed

a的析构函数不会被调用。

转载于:https://www.cnblogs.com/sssblog/p/11452164.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用pthread实现的快速排序并计时的C代码: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <sys/time.h> #define MAX_N 1000000 #define MAX_THREAD_NUM 8 int a[MAX_N]; int n, num_threads; typedef struct { int left; int right; } Range; void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } int partition(int left, int right) { int pivot = a[left]; int i = left, j = right + 1; while (1) { do { i++; } while (a[i] < pivot && i <= right); do { j--; } while (a[j] > pivot); if (i >= j) break; swap(&a[i], &a[j]); } swap(&a[left], &a[j]); return j; } void quicksort(int left, int right) { if (left >= right) return; int pivot_index = partition(left, right); quicksort(left, pivot_index - 1); quicksort(pivot_index + 1, right); } void *quicksort_thread(void *arg) { Range *range = (Range *)arg; int left = range->left; int right = range->right; if (left >= right) return NULL; int pivot_index = partition(left, right); if (num_threads > 1) { pthread_t thread_left, thread_right; Range range_left = {left, pivot_index - 1}; Range range_right = {pivot_index + 1, right}; if (num_threads > 2) { num_threads--; pthread_create(&thread_left, NULL, quicksort_thread, &range_left); quicksort_thread(&range_right); pthread_join(thread_left, NULL); num_threads++; } else { pthread_create(&thread_left, NULL, quicksort_thread, &range_left); quicksort_thread(&range_right); pthread_join(thread_left, NULL); } } else { quicksort(left, pivot_index - 1); quicksort(pivot_index + 1, right); } return NULL; } int main() { struct timeval start, end; srand(time(NULL)); printf("Enter the number of elements: "); scanf("%d", &n); printf("Enter the number of threads: "); scanf("%d", &num_threads); for (int i = 0; i < n; i++) { a[i] = rand() % 1000000; } gettimeofday(&start, NULL); pthread_t thread; Range range = {0, n - 1}; pthread_create(&thread, NULL, quicksort_thread, &range); pthread_join(thread, NULL); gettimeofday(&end, NULL); printf("Time elapsed: %ld microseconds.\n", (end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec); return 0; } ``` 在这个代码中,我们定义了一个数据结构`Range`,用于表示快速排序的左右边界。`quicksort_thread`函数是快速排序的线程函数,接受一个指向`Range`结构体的指针作为参数。如果当前线程数`num_threads`大于1,则递归地创建两个线程来分别处理左右两个子区间;否则,直接在当前线程中进行快速排序。 在主函数中,我们首先生成随机数作为排序的输入,然后调用`quicksort_thread`函数在多线程环境下进行快速排序,并使用`gettimeofday`函数计时。 需要注意的是,在递归创建线程时,我们需要先将`num_threads`减一,避免创建过多线程。此外,在创建线程时,我们需要传递一个指向`Range`结构体的指针作为线程参数,并在线程结束后调用`pthread_join`函数等待线程结束,防止线程未结束就退出程序。 需要编译时需要添加`-pthread`参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值