欢迎光临散文网 会员登陆 & 注册

线程基本操作 (4)线程的取消

2022-09-25 14:52 作者:GXTon_阿通  | 我要投稿

应用场景:

比如,在搜索东西的时候.每个线程负责搜索一个目录,当有一个线程搜索到了要找的内容.那么其他所有线程就没有寻找的必要了.所以就可以取消搜索线程.程序进行下一步操作了...

pthread_join()和wait()性质一样,是不能收回正在运行的线程的.
所以需要新的函数: pthread_cancel()

如果想要杀死一个线程,就先用 pthread_cancel() 然后再用 pthread_join().

用man查一下:

注意问题:

如果一个线程A中正在运行着程序,打开了很多文件。
线程B  要取消 线程A, 这个时候,线程A里面的文件都没有来的及关闭,就会有bug。
怎么解决,就是在线程A每次打开一个文件的时候,就要挂一个钩子函数,钩子函数负责关闭对应的文件。

但是上面还有一个问题。如果没有来得及挂钩子函数呢?
这里涉及到取消状态的问题。

被取消的线程A,可以设置:
不允许取消:对取消信号不理睬.
允许取消: 异步取消;推迟取消(推迟到cancel点再相应。cancel点 POSIX规定的, 都是可能引发阻塞的系统调用。)
所以,没有来及挂钩子函数的这种情况是不会存在的,因为打开文件,挂钩子函数之间不要有cancel点就可以了。

cancel点的设置:
pthread_setcancelstate() 设置是否被允许取消.
pthread_setcanceltype() 设置取消方式.异步cancel或推迟cancel.
pthread_testcancel()  它本身就是一个取消点,函数本身不做什么.

线程基本操作 (4)线程的取消的评论 (共 条)

分享到微博请遵守国家法律