还剩4页未读,继续阅读
文本内容:
线程终止的4种方式示例demo最简单的demo statvoid*thru uncvoid*arg{int i=0;//abLe tobe ceLpthread_setcancelstatePTHREAD_CANCEL_ENABLE,NULL;pthread_setcanceltypePTHREAD_CANCEL_DEFERRED,NULL;;;f i=i++{printfthread1%dsleepl;int mainintargc,char**argv{pthread_t t;void*res;pthread_createt,NULL,threadl_func NULL;⑶;sleeppthread_cancelt;//canceL threadl〃⑷pthread_joint,res;t t卜二if res=PTHREAD_CANCEprintfthreadl wasrminate by cancelprir tfthreadl wasnot terminate bycancel工exitEX T_SUCCESS;为了突出重点,省略了检查返回值运行效果:thread^O^breadrthreadl2threadl wasterminatebycancel主线程先创建线程threadl,然后睡眠3秒后发出终止threadl的请求接收到终止请求后,threadl会在合适的时机被终止掉主线程通过pthread_join阻塞等待threadl退出几个要点线程终止的4种方式:线程的执行函数返回了,这和main函数结束类似线程调用了pthread_exit函数,这和调用exit返回类似线程被另一个线程通过pthread_cancel函数取消,这和通过kill发送SIGKILL信号类似进程终止了,则进程中的所有线程也会终止
8.取消某个线程的常规步骤被取消的线程允许取消,pthread_setcancelstate,参数可选值•PTHREAD_CANCEL_ENABLE,这是默认值;•PTHREAD_CANCEL_DISABLE;设置取消类型,pthread_setcanceltype,参数可选值:PTHREAD_CANCEL_ASYNCHRONOUS,异步方式,当发出取消请求后,线程可能会在任何点被杀死■■PTHREAD.CANCEL_DEFERRED,延迟方式,线程只会在特定的取消点cancellationpoints,调用某个函数前被杀死■发起取消的线程发送取消要求,pthread_cancel,发出取消请求后,pthread_cancel当即返回,不会等待目标线程的退出等待取消完成,pthread_joino
4.哪些函数是取消点?POSIX.1指定了哪些函数一定是取消点:accept nanosleepOsemjimedwaitaio_suspend opensem_waitdock_nanosleep pausesendclose pollsendmsgOconnect preadsendtocreat pselectsigpausefcntlF_SETLKW pthread-condJimedwaitO sigsuspendOpthread_cond_wait sigtimedwaitOfdatasyncpthreadjoin sigwaitfsyncgetmsgOpthread_testcancel sigwaitinfogetpmsgOputmsgO sleeplockfF_LOCK putpmsgOsystemmq-receiveO pwritetcdrainmq_send readusleepmqjimedreceive readvwaitmq_timedsend recvwaitidmsgrcv recvfromwaitpidmsgsnd recvmsgOwritemsync selectQwritev点击查看大图更多关于取消点的介绍:$man7pthreadsCancellation pointsaio_s us pendQ^^B:lock_nanosleep阅读开源软件MJPG-streamerMJPG-streamer是什么?简单地说,就是一个开源的流媒体服务器.com/jacksonliam/mjpg-streamer通过mjpg-streamer,你可以通过PC浏览器访问到板子上的摄像头图像MJPG-streamer是如何结束工作线程的?MJPG-streamer运行时一般会有3个线程•主线程;•负责数据的输入的线程(例如camera capturethread);•负责输出数据的线程(例如http serverthread).以http serverthread为例void*server_threadvoid*arg{■MMpthread_cleanup_popl;pthread_cleanup_push用于注册清理函数到栈中,当线程遭取消时,会沿该栈自顶向下依次执行清理函数当用户通过按下Ctrl+c要求结束程序时,主线程会要求杀掉http serverthread等各种线程static voidsignal_handlerint sig{fori=0;iglobal,outcnt;i++•工pthread_cancelservers[id].thread D;接下来,当http serverthread遇到某个取消点时,server_cleanup会被调用以完成清理工作这里只是简单地分析一下,MJPG-Streamer里多线程相关的代码挺复杂的,有兴趣的小伙伴们自行阅读吧相关参考开源软件/MJPG-StreamerLinux系统编程第2版1—
7.6终止线程Linux程序设计第4版/
12.7取消一个线程Linux-Unix系统编程手册/32线程线程取消Unix环境高级编程/
11.5线程终止审核编辑李倩。