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