色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux和Windows系統中的多線程應用程序并行性

星星科技指導員 ? 來源:嵌入式計算設計 ? 作者:Eduard Trunov ? 2022-11-30 15:27 ? 次閱讀

多線程應用程序并行性

通常,在多線程應用程序中有兩種相互關聯但不同的現象:并發性和并行性。

并發是兩個或多個線程在執行中重疊的能力。

并行性是同時執行兩個或多個線程的能力。

正是并發性導致了流式處理中的大多數復雜性 - 線程可以以不可預測的順序執行。在線程共享資源的情況下,這無疑會導致競爭條件。

術語爭用條件通常是指對兩個和多個線程的共享資源的不同步訪問導致錯誤的程序行為的情況。

讓我們看一個比賽的例子。

如今,很難想象我們沒有塑料卡的生活。ATM取款很久以前就成為日常工作:插入卡,輸入PIN碼和所需的金額。如果成功完成,我們將收到計劃的現金金額。反過來,銀行需要通過以下算法驗證資金是否可用:

銀行賬戶上是否至少有 X 個單位的可用貨幣?

如果是,將帳戶余額減少 X 值,向用戶分配 X 個貨幣單位。

否則,將生成錯誤消息。

具有爭用條件的代碼示例:

int cash_out(struct account *ac, int amount) {

const int balance = ac->balance;

if (balance < amount)

return -1;

ac->balance = balance - amount;

discard_money_routine(amount);

return 0;

}

當在線支付購買并“同時”從 ATM 提取現金時,可能會出現種族。

為了避免比賽,有必要對代碼進行以下更新:

int cash_out(struct account *ac, int amount) {

lock();

const int balance = ac->balance;

if (balance < amount)

return -1;

ac->balance = balance - amount;

unlock();

discard_money_routine(amount);

return 0;

}

在Windows操作系統中,需要獨占訪問某些共享數據的代碼區域稱為“關鍵部分”。

用于處理關鍵部分的結構類型為CRITICAL_SECTION。讓我們回顧一下它的字段:

typedef struct _RTL_CRITICAL_SECTION {

PRTL_CRITICAL_SECTION_DEBUG DebugInfo;

//

// The following three fields control entering and exiting the critical

// section for the resource

//

LONG LockCount;

LONG RecursionCount;

HANDLE OwningThread; // from the thread's ClientId->UniqueThread

HANDLE LockSemaphore;

ULONG_PTR SpinCount; // force size on 64-bit systems when packed

} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

盡管CRITICAL_SECTION正式不屬于未記錄的結構,但微軟仍然認為用戶無需了解其組織。實際上,它是一種黑匣子。要使用此結構,無需直接使用其字段,而只需通過 Windows 函數,將此結構的相應實例的地址傳遞給它們。

CRITICAL_SECTION結構通過以下調用初始化:

void 初始化關鍵部分(PCRITICAL_SECTION 個);

如果我們知道不再需要CRITICAL_SECTION結構,那么我們可以借助以下調用將其刪除:

無效刪除關鍵部分(PCRITICAL_SECTION個);

使用共享資源的代碼區域應先進行以下調用:

無效的進入臨界部分(PCRITICAL_SECTION個);

我們可以使用以下命令代替EnterCriticalSection:

bool 嘗試輸入關鍵部分(PCRITICAL_SECTION 個);

TryEnterCriticalSection允許線程檢查資源可訪問性,并在無法訪問時參與另一個活動。在成功的情況下(函數返回TRUE),很明顯結構元素已更新,資源已鎖定。

在使用共享資源的代碼區域末尾,應始終存在以下調用:

void LeaveCriticalSection(PCRITICAL_SECTION pcs);


LeaveCriticalSection檢查CRITICAL_SECTION結構元素,并將資源鎖定計數器 (LockCount) 減少 1。

類似于 Linux 操作系統中的CRITICAL_SECTION是可變互斥pthread_mutex_t。在使用之前,需要初始化此變量 – 寫入常量PTHREAD_MUTEX_INITIALIZER的值或調用pthread_mutex_init函數。

#include

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

要使用默認屬性值初始化互斥鎖,必須將NULL傳遞給attr屬性??梢栽趲椭撁嫔险业教囟ǖ幕コ怄i屬性值。

可以通過以下調用刪除互斥鎖:

int pthread_mutex_destroy(pthread_mutex_t *mutex);


通過調用pthread_mutex_lock函數鎖定互斥鎖:

int pthread_mutex_lock(pthread_mutex_t *mutex);


如果互斥鎖已被鎖定,則調用線程將被阻塞,直到釋放互斥鎖?;コ怄i在pthread_mutex_unlock功能的幫助下解鎖:

int pthread_mutex_unlock(pthread_mutex_t *mutex);


如果我們想檢查資源的可訪問性,那么我們可以使用pthread_mutex_trylock函數:

int pthread_mutex_trylock(pthread_mutex_t *mutex);


如果互斥鎖被鎖定,上述函數將返回EBUSY。

所有用于處理互斥鎖的函數在成功時返回 0,在失敗時返回錯誤代碼。

讓我們總結一下。在 Windows 操作系統中,要使用共享資源,必須使用關鍵部分和特殊類型的CRITICAL_SECTION。在 Linux 操作系統中,我們可以出于相同目的使用pthread_mutex_t類型的互斥體。

同步功能記錄在表 4 中。

窗口函數 Linux函數
初始化關鍵部分 pthread_mutex_init()
進入關鍵部分 pthread_mutex_lock()
離開關鍵部分 pthread_mutex_unlock()
嘗試進入關鍵部分 pthread_mutex_trylock()
刪除關鍵部分 pthread_mutex_destroy()

表 4.共享資源的同步功能。

螺紋端接

在實踐中,需要編寫線程終止的情況之一是海量數據處理。當主線程向所有線程發出退出信號,但其中一個線程仍在處理信息時,可能會出現這種情況。如果與信息丟失相比,及時性是應用程序性能的更高優先級因素,則需要退出線程并釋放系統資源。本節將介紹退出線程的方法。

線程可以通過以下方式退出:

線程函數返回

線程調用 ExitThread 函數

進程的任何線程都調用 TerminateThread 函數

進程的任何線程都調用 ExitProcess 函數

讓我們仔細看看其中的每一個。

線程函數返回。

干凈代碼的一個很好的例子是設計線程函數,以便線程僅在函數返回后終止。在 Windows 操作系統中,這種線程終止方式保證正確清理線程擁有的資源。在 Linux 操作系統中,在線程可連接的情況下,必須調用其中一個連接函數。在一般情況下,會發生以下情況:

系統正確釋放線程占用的資源。

系統設置線程退出代碼。

此內核對象 ?thread? 的用戶計數器減少 1。

在 Windows 操作系統中,可以通過調用以下內容來強制終止線程:

void ExitThread(DWORD dwExitCode);

線程退出代碼值將添加到dwExitCode參數中。很容易注意到該函數沒有返回值,因為在調用該函數后,線程將不復存在。

在Linux操作系統中,有一個完整的ExitThread模擬

void pthread_exit(void *rval_ptr);


參數rval_ptr表示包含返回值的非類型指針。此指針可由調用pthread_join函數的其他進程線程獲取。

函數調用pthread_join將線程帶到分離狀態。此狀態允許贏回線程資源。如果線程已處于分離狀態,則調用pthread_join的線程將收到ESRCH錯誤代碼。有時,當使用第二個非NULL參數調用pthread_join時,可能會輸出分段錯誤錯誤。

進程的任何線程都調用 TerminateThread 函數。

一個線程可以傳遞請求以強制終止同一進程中的另一個線程。在Windows操作系統中,這是在以下功能的幫助下組織的:

bool TerminateThread(

HANDLE hThread,

DWORD dwExitCode

);

上述函數從任何其他線程終止了 hThread線程。您可以向dwExitCode參數添加一個值,系統將視之為線程退出代碼。線程被殺死后,此內核對象 ?thread? 的用戶計數器將減少 1。

在 Linux 操作系統中,當一個線程可以通過調用pthread_cancel函數傳遞強制終止同一進程中另一個線程的請求時,可以實現類似的功能:

int pthread_cancel(pthread_t tid);

此函數需要與pthread_setcancelstate和pthread_setcanceltype函數結合使用。如果使用pthread_cancel,rval_ptr將被PTHREAD_CANCELED。

讓我們仔細看看erminateThread和 Linux 操作系統中的類似操作:

#ifdef __PL_WINDOWS__

BOOL bret = FALSE;

bret = TerminateThread(h, x);

#endif //__PL_WINDOWS__

#ifdef __PL_LINUX__

int iret = 0, bret;

iret = syscall(SYS_tkill,tid, 0);

if (iret == 0) {

iret = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);

if (iret != 0) {

bret = FALSE;

}

else {

iret = pthread_cancel(h);

if (iret == 0 || iret == ESRCH) {

bret = TRUE;

} else {

wait_thread:

clock_gettime(CLOCK_REALTIME, &wait_time);

ADD_MS_TO_TIMESPEC(wait_time, 1000); //1000 ms

iret = pthread_timedjoin_np(h, NULL, &wait_time);

switch (iret) {

case 0:

bret = TRUE;

break;

case ETIMEDOUT:

if (retries_count++ < 5) // 5 Attempts

{

goto wait_thread;

}

bret = FALSE;

break;

default:

bret = FALSE;

break;

}

}

(void)pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);

}

}

else {

bret = TRUE;

}

#endif //__PL_LINUX__

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11322

    瀏覽量

    209864
  • WINDOWS
    +關注

    關注

    4

    文章

    3551

    瀏覽量

    88916
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19708
收藏 人收藏

    評論

    相關推薦

    socket 多線程編程實現方法

    是指在同一個進程運行多個線程,每個線程可以獨立執行任務。線程共享進程的資源,如內存空間和文件句柄,但每個線程有自己的
    的頭像 發表于 11-12 14:16 ?398次閱讀

    Python多線程和多進程的區別

    Python作為一種高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的兩種方式之一。在本文中,我們將探討Python多線程與多進程的概念、區別以及如何使用線程池與進
    的頭像 發表于 10-23 11:48 ?424次閱讀
    Python<b class='flag-5'>中</b><b class='flag-5'>多線程</b>和多進程的區別

    一文掌握Python多線程

    使用線程可以把占據長時間的程序的任務放到后臺去處理。
    的頭像 發表于 08-05 15:46 ?878次閱讀

    多線程設計模式到對 CompletableFuture 的應用

    最近在開發 延保服務 頻道頁時,為了提高查詢效率,使用到了多線程技術。為了對多線程方案設計有更加充分的了解,在業余時間讀完了《圖解 Java 多線程設計模式》這本書,覺得收獲良多。本篇文章將介紹其中
    的頭像 發表于 06-26 14:18 ?373次閱讀
    從<b class='flag-5'>多線程</b>設計模式到對 CompletableFuture 的應用

    bootloader開多線程做引導程序,跳app初始化后直接進hardfualt,為什么?

    如標題,想做一個遠程升級的項目,bootloader引導區域和app都是開多線程跑的,就是自己寫了個小的任務調度器,沒什么功能主要是想讓程序快速的響應,延時不會對其他程序造成堵塞,程序
    發表于 04-18 06:07

    鴻蒙OS開發實例:【ArkTS類庫多線程CPU密集型任務TaskPool】

    CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主線程進行。例如圖像處理、視頻編碼、數據分析等。 基于多線程
    的頭像 發表于 04-01 22:25 ?859次閱讀
    鴻蒙OS開發實例:【ArkTS類庫<b class='flag-5'>多線程</b>CPU密集型任務TaskPool】

    鴻蒙APP開發:【ArkTS類庫多線程】TaskPool和Worker的對比

    TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型任務??梢杂行У乇苊膺@些任務阻塞主線程,從而最大化系統的利用率,降
    的頭像 發表于 03-26 22:09 ?670次閱讀
    鴻蒙APP開發:【ArkTS類庫<b class='flag-5'>多線程</b>】TaskPool和Worker的對比

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(一)

    TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型任務。可以有效地避免這些任務阻塞主線程,從而最大化系統的利用率,降
    發表于 03-25 14:11

    java實現多線程的幾種方式

    Java實現多線程的幾種方式 多線程是指程序包含了兩個或以上的線程,每個線程都可以
    的頭像 發表于 03-14 16:55 ?754次閱讀

    Linux的用途及優勢在哪里?

    Linux是一套免費使用和自由傳播的類Unix操作系統,是一個多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟件、應用程
    發表于 03-07 11:10 ?1547次閱讀
    <b class='flag-5'>Linux</b>的用途及優勢在哪里?

    python5種線程鎖盤點

    線程安全是多線程或多進程編程的一個概念,在擁有共享數據的多條線程并行執行的程序
    發表于 03-07 11:08 ?1623次閱讀
    python<b class='flag-5'>中</b>5種<b class='flag-5'>線程</b>鎖盤點

    AT socket可以多線程調用嗎?

    請問AT socket 可以多線程調用嗎? 有互鎖機制嗎,還是要自己做互鎖。
    發表于 03-01 08:22

    什么是多核多線程?多核多線程如何提高程序的運行效率?

    線程無法充分利用多核處理器的并行計算能力。
    的頭像 發表于 02-20 10:22 ?1402次閱讀

    linux多線程編程實例

    linux線程
    的頭像 發表于 02-15 21:16 ?491次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>多線程</b>編程實例

    linuxwindows的區別 linux系統一般用來干嘛

    LinuxWindows是兩種不同的操作系統,有著不同的設計理念和用途。本文將對LinuxWindows的區別進行詳細分析,并介紹
    的頭像 發表于 02-05 14:06 ?1003次閱讀
    主站蜘蛛池模板: 亚洲视频无码高清在线| 色悠久久久久综合欧美99| 动漫美女禁区图| jizz女学| 97色伦图片97色伦图影院久久| 亚洲欧洲久久| 亚洲不卡视频| 亚洲国产无线码在线观看| 亚洲AV久久无码精品九号软件| 玩两个少妇女邻居| 同桌别揉我奶了嗯啊| 无码人妻99久久密AV| 午夜免费福利小电影| 无码人妻丰满熟妇区五十路久久 | 青草在线观看视频| 男人J放进女人屁股免费观看| 美女胸被男子强捏视频| 免费视频久久只有精品| 男人的天堂久久精品激情a| 暖暖 视频 在线 观看 高清 | 中国老头oldday tv| 真实农村女人野外自拍照片| 中文字幕无码一区二区免费 | www色小姐| 成人在线视频网站| 成人免费在线视频| 国产精品久久久久久人妻精品蜜桃| 国产精品亚洲高清一区二区| 狠狠狠狠狠狠干| 久久视热频国只有精品| 挠黑色超薄丝袜脚心vk40分钟| 欧美日韩一区在线观看| 日日夜夜噜噜| 午夜理论在线观看不卡大地影院| 亚洲二区电影| 中文字幕人成人乱码亚洲影视| JEALOUSVUE成熟老师APP| 俄罗斯搜索引擎Yandex推广入口| 国产三级精品三级男人的天堂| 久久99AV无色码人妻蜜柚| 美女网站免费看|