江苏品牌网站建设电话wordpress无法缩进
2026/4/25 19:43:19 网站建设 项目流程
江苏品牌网站建设电话,wordpress无法缩进,免费软件app网站下载大全,修改wordpress登录背景图片文章目录线程取消的两个维度取消状态#xff08;State#xff09;取消类型#xff08;Type#xff09;推迟取消#xff08;DEFERRED#xff09;异步取消#xff08;ASYNCHRONOUS#xff09;取消点作用示例清理函数函数接口执行时机解决异步取消的死锁问题例程#xff…文章目录线程取消的两个维度取消状态State取消类型Type推迟取消DEFERRED异步取消ASYNCHRONOUS取消点作用示例清理函数函数接口执行时机解决异步取消的死锁问题例程5秒内取消线程的作业问题解决方案1添加取消点解决方案2使用异步取消需要清理函数线程取消是一种请求终止另一个线程执行的机制类似于进程的信号机制但是专门用于线程间通信intpthread_cancel(pthread_tthread);// 发送取消请求重要pthread_cancel()只是发送请求线程是否终止、何时终止取决于线程自身的取消设置线程取消的两个维度取消状态State是否接受取消请求intpthread_setcancelstate(intstate,int*oldstate);state可以是以下两个值之一PTHREAD_CANCEL_ENABLE接受取消请求默认PTHREAD_CANCEL_DISABLE拒绝取消请求oldstate:指向一个 int 类型变量的指针用于保存线程之前的取消状态如果不需要保存旧状态可以将其设置为NULL取消类型Type如何响应取消请求intpthread_setcanceltype(inttype,int*oldtype);type是两个值之一PTHREAD_CANCEL_DEFERRED推迟到取消点默认PTHREAD_CANCEL_ASYNCHRONOUS立即响应异步oldtype和oldstate类似它保存线程之前的取消类型如果不需要保存旧类型也是将其设置为NULL推迟取消DEFERRED安全只在预定义的安全点检查取消// 线程函数void*thread_func(void*arg){pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);// 默认while(1){printf(Working...\n);// 取消点检查取消请求// 如果在这里收到取消请求会在printf处响应for(inti0;i1000000;i);// 非取消点不会响应}returnNULL;}异步取消ASYNCHRONOUS立即响应但可能导致资源泄漏和死锁void*thread_func(void*arg){pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);pthread_mutex_lock(mutex);// 加锁glob;// 修改共享数据// 可能在这里被立即取消导致锁未释放pthread_mutex_unlock(mutex);// 可能永远执行不到returnNULL;}取消点取消点是线程检查是否有取消请求的特定位置只有在这些位置线程才会响应推迟的取消请求作用保证线程在安全的状态下被取消避免资源泄漏和数据不一致// 阻塞型系统调用read(),write(),accept(),connect()sleep(),usleep(),nanosleep()pthread_cond_wait(),pthread_cond_timedwait()pthread_join(),sem_wait()// 标准I/O函数printf(),scanf(),fgets(),fread()// 专门函数pthread_testcancel()// 手动创建取消点示例void*thread_func(void*arg){for(inti0;i10;i){printf(Running: %d\n,i);// printf是取消点// 如果没有取消点函数线程不会检查取消请求for(longj0;j1000000000;j);// 纯循环不是取消点}returnNULL;}清理函数异步取消或在取消点被取消时线程可能持有资源锁、内存等清理函数确保这些资源被正确释放函数接口voidpthread_cleanup_push(void(*routine)(void*),void*arg);voidpthread_cleanup_pop(intexecute);执行时机voidcleanup(void*arg){printf(清理资源: %s\n,(char*)arg);}void*thread_func(void*arg){char*resourcemalloc(100);pthread_cleanup_push(cleanup,resource);// 压入栈// 以下情况会执行清理函数// 1. pthread_cancel() 取消线程// 2. pthread_exit() 线程主动退出// 3. pthread_cleanup_pop(1) 显式弹出并执行if(error){pthread_exit(NULL);// 执行清理函数}pthread_cleanup_pop(0);// 弹出但不执行正常情况free(resource);// 正常释放returnNULL;}解决异步取消的死锁问题问题void*thread_func(void*arg){pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);pthread_mutex_lock(mutex);// 加锁glob;// 可能在这里被取消sleep(4);// 长时间操作pthread_mutex_unlock(mutex);// 永远执行不到 → 死锁returnNULL;}解决方案使用清理函数voidunlock_mutex(void*arg){pthread_mutex_t*mutex(pthread_mutex_t*)arg;pthread_mutex_unlock(mutex);printf(清理解锁互斥量\n);}void*thread_func(void*arg){pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);pthread_mutex_lock(mutex);pthread_cleanup_push(unlock_mutex,mutex);// 注册清理函数glob;// 即使在这里被取消清理函数也会执行sleep(4);pthread_cleanup_pop(1);// 弹出并执行清理函数正常流程也执行// pthread_mutex_unlock(mutex); // 不再需要清理函数已处理returnNULL;}例程5秒内取消线程的作业问题// 线程函数没有取消点即使发送取消请求也不会响应void*ThreadFunc(void*arg){intloops*((int*)arg);for(intj0;jloops;j){pthread_mutex_lock(mutex);glob;pthread_mutex_unlock(mutex);// 没有取消点}pthread_exit(NULL);}解决方案1添加取消点void*ThreadFunc(void*arg){intloops*((int*)arg);// 启用取消pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);for(intj0;jloops;j){pthread_mutex_lock(mutex);glob;pthread_mutex_unlock(mutex);// 定期添加取消点if(j%10000){pthread_testcancel();// 手动创建取消点}}pthread_exit(NULL);}// 主线程5秒后取消intmain(){// ... 创建线程sleep(5);pthread_cancel(tid1);pthread_cancel(tid2);// ...}解决方案2使用异步取消需要清理函数voidcleanup_unlock(void*arg){pthread_mutex_unlock(mutex);}void*ThreadFunc(void*arg){intloops*((int*)arg);pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);for(intj0;jloops;j){pthread_mutex_lock(mutex);pthread_cleanup_push(cleanup_unlock,NULL);glob;pthread_cleanup_pop(1);// 弹出并执行正常流程// 如果被取消清理函数也会自动执行}pthread_exit(NULL);}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询