网站建设维护什么意思,网站开发与建设,网站建设模板能实现按钮跳转吗,腾讯朋友圈广告怎么投放一、线程的取消
意义#xff1a;随时杀掉一个线程
int pthread_cancel(pthread_t thread);
注意#xff1a;线程的取消要有取消点才可以#xff0c;不是说取消就取消#xff0c;线程的取消点主要是阻塞的系统调用
二、运行段错误调试
可以使用gdb调试
使用gdb 运行代…一、线程的取消
意义随时杀掉一个线程
int pthread_cancel(pthread_t thread);
注意线程的取消要有取消点才可以不是说取消就取消线程的取消点主要是阻塞的系统调用
二、运行段错误调试
可以使用gdb调试
使用gdb 运行代码gdb ./youapp
(gdb) run
等待出现Thread 1 pcancel received signal SIGSEGV, Segmentation fault.
输入命令bt打印调用栈
(gdb) bt
#0 0x00007ffff783ecd0 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff78458a9 in printf () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00000000004007f9 in main () at pcancel.c:21
确定段错误位置是pcancel.c 21行
三、线程的取消
如果没有取消点手动设置一个
void pthread_testcancel(void); 设置取消使能或禁止
int pthread_setcancelstate(int state, int *oldstate);
PTHREAD_CANCEL_ENABLE
PTHREAD_CANCEL_DISABLE 设置取消类型
int pthread_setcanceltype(int type, int *oldtype);
PTHREAD_CANCEL_DEFERRED 等到取消点才取消
PTHREAD_CANCEL_ASYNCHRONOUS 目标线程会立即取消
四、线程的清理
必要性 当线程非正常终止需要清理一些资源。
void pthread_cleanup_push(void (*routine) (void *), void *arg)
void pthread_cleanup_pop(int execute)
routine 函数被执行的条件
被pthread_cancel取消掉。执行pthread_exit非0参数执行pthread_cleanup_pop()
注意
1.必须成对使用即使pthread_cleanup_pop不会被执行到也必须写上否则编译错误
2.pthread_cleanup_pop()被执行且参数为0pthread_cleanup_push回调函数routine不会被执行.
3.pthread_cleanup_push 和pthread_cleanup_pop可以写多对routine执行顺序正好相反
4.线程内的return 可以结束线程也可以给pthread_join返回值但不能触发pthread_cleanup_push里面的回调函数所以我们结束线程尽量使用pthread_exit退出线程。