在 Windows 操作系統(tǒng)中,TerminateThread在成功終止的情況下返回TRUE。從這個邏輯出發(fā),讓我們嘗試在 Linux 中組織類似的功能。
首先,我們將檢查線程是否處于活動狀態(tài)。為此,我們將發(fā)送一個零信號。如果進(jìn)程中存在線程并且正在執(zhí)行,則tkill將返回 0。之后,我們將使用PTHREAD_CANCEL_ASYNCHRONOUS參數(shù)調(diào)用 pthread_setcanceltype 函數(shù),只有在此之后,我們才會嘗試通過調(diào)用 pthread_cancel 函數(shù)來終止線程.有一種可能的情況是線程仍將執(zhí)行一段時間,為此我們將使用定時等待函數(shù)pthread_timedjoin_np(示例中有五次嘗試;每次需要 1000 毫秒)。線程終止后,我們會調(diào)用pthread_setcanceltype再次使用PTHREAD_CANCEL_DEFERRED參數(shù)。如果有任何錯誤,將始終返回 FALSE。
進(jìn)程的任何線程都會調(diào)用 ExitProcess 函數(shù)。
如果其中一個線程調(diào)用退出函數(shù)(對于 Linux 操作系統(tǒng)),或者ExitProcess或TerminateProcess(對于 Windows 操作系統(tǒng)),那么整個進(jìn)程將被終止。同樣,如果一個線程接收到一個動作包含在進(jìn)程終止中的信號,這個信號將終止整個進(jìn)程。
讓我們總結(jié)一下。正確設(shè)計的應(yīng)用程序不應(yīng)調(diào)用強制線程終止函數(shù)。推薦的方法是線程函數(shù)返回時。在 Linux 操作系統(tǒng)中線程終止的情況下,連接將釋放進(jìn)程擁有的鏈接和系統(tǒng)資源。必須適當(dāng)考慮兩次調(diào)用 join 函數(shù)是不正確的事實(最好會出現(xiàn)錯誤)。如果 Windows 操作系統(tǒng)的線程被強制終止,請務(wù)必注意所有非系統(tǒng)資源應(yīng)以任何方式清理。在 Linux 中,有pthread_cleanup_push和pthread_cleanup_pop函數(shù)。
線程終止函數(shù)記錄在表 5 中。
表 5. 線程終止函數(shù)。
結(jié)論
為了減輕中斷的影響,操作系統(tǒng)提供了一個由并行運行的進(jìn)程組成的模型。但是,該模型在交互、自身地址空間的可用性等方面存在弱點。
另一方面,應(yīng)用程序在一個進(jìn)程中擁有多個控制線程可能是有利的。由于這些線程屬于同一個進(jìn)程,它們使用自己堆棧上的共享地址空間。
線程可以使用信號量、消息等原語相互交互。這些原語對于使在臨界區(qū)中不可能同時執(zhí)行兩個或多個線程是必要的。線程可以處于以下狀態(tài)之一:可運行或執(zhí)行阻塞。一個線程也可以使用交互原語與另一個線程交互。請記住,在使用交互原語時,應(yīng)小心避免錯誤和死鎖。
在本文中,我們分析了 Windows 和 Linux 操作系統(tǒng)的流式處理 API;提出了基于事件的線程創(chuàng)建和同步接口;討論了使用共享資源的功能;以及詳細(xì)的線程終止方式。
審核編輯:郭婷
-
Linux
+關(guān)注
關(guān)注
87文章
11161瀏覽量
208460 -
WINDOWS
+關(guān)注
關(guān)注
3文章
3509瀏覽量
88200 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6603瀏覽量
123020
發(fā)布評論請先 登錄
相關(guān)推薦
評論