線程基本操作 (4)線程的取消
應(yīng)用場景:
比如,在搜索東西的時候.每個線程負責搜索一個目錄,當有一個線程搜索到了要找的內(nèi)容.那么其他所有線程就沒有尋找的必要了.所以就可以取消搜索線程.程序進行下一步操作了...
pthread_join()和wait()性質(zhì)一樣,是不能收回正在運行的線程的.
所以需要新的函數(shù): pthread_cancel()
如果想要殺死一個線程,就先用 pthread_cancel() 然后再用 pthread_join().

用man查一下:



注意問題:
如果一個線程A中正在運行著程序,打開了很多文件。
線程B? 要取消 線程A, 這個時候,線程A里面的文件都沒有來的及關(guān)閉,就會有bug。
怎么解決,就是在線程A每次打開一個文件的時候,就要掛一個鉤子函數(shù),鉤子函數(shù)負責關(guān)閉對應(yīng)的文件。
但是上面還有一個問題。如果沒有來得及掛鉤子函數(shù)呢?
這里涉及到取消狀態(tài)的問題。
被取消的線程A,可以設(shè)置:
不允許取消:對取消信號不理睬.
允許取消: 異步取消;推遲取消(推遲到cancel點再相應(yīng)。cancel點 POSIX規(guī)定的, 都是可能引發(fā)阻塞的系統(tǒng)調(diào)用。)
所以,沒有來及掛鉤子函數(shù)的這種情況是不會存在的,因為打開文件,掛鉤子函數(shù)之間不要有cancel點就可以了。
cancel點的設(shè)置:
pthread_setcancelstate() 設(shè)置是否被允許取消.
pthread_setcanceltype() 設(shè)置取消方式.異步cancel或推遲cancel.
pthread_testcancel()? 它本身就是一個取消點,函數(shù)本身不做什么.