哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux和Windows系統(tǒng)中的多線程應(yīng)用程序并行性

星星科技指導(dǎo)員 ? 來(lái)源:嵌入式計(jì)算設(shè)計(jì) ? 作者:Eduard Trunov ? 2022-11-30 15:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

多線程應(yīng)用程序并行性

通常,在多線程應(yīng)用程序中有兩種相互關(guān)聯(lián)但不同的現(xiàn)象:并發(fā)性和并行性。

并發(fā)是兩個(gè)或多個(gè)線程在執(zhí)行中重疊的能力。

并行性是同時(shí)執(zhí)行兩個(gè)或多個(gè)線程的能力。

正是并發(fā)性導(dǎo)致了流式處理中的大多數(shù)復(fù)雜性 - 線程可以以不可預(yù)測(cè)的順序執(zhí)行。在線程共享資源的情況下,這無(wú)疑會(huì)導(dǎo)致競(jìng)爭(zhēng)條件。

術(shù)語(yǔ)爭(zhēng)用條件通常是指對(duì)兩個(gè)和多個(gè)線程的共享資源的不同步訪問(wèn)導(dǎo)致錯(cuò)誤的程序行為的情況。

讓我們看一個(gè)比賽的例子。

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

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

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

否則,將生成錯(cuò)誤消息。

具有爭(zhēng)用條件的代碼示例:

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;

}

當(dāng)在線支付購(gòu)買(mǎi)并“同時(shí)”從 ATM 提取現(xiàn)金時(shí),可能會(huì)出現(xiàn)種族。

為了避免比賽,有必要對(duì)代碼進(jìn)行以下更新:

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操作系統(tǒng)中,需要獨(dú)占訪問(wèn)某些共享數(shù)據(jù)的代碼區(qū)域稱為“關(guān)鍵部分”。

用于處理關(guān)鍵部分的結(jié)構(gòu)類(lèi)型為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正式不屬于未記錄的結(jié)構(gòu),但微軟仍然認(rèn)為用戶無(wú)需了解其組織。實(shí)際上,它是一種黑匣子。要使用此結(jié)構(gòu),無(wú)需直接使用其字段,而只需通過(guò) Windows 函數(shù),將此結(jié)構(gòu)的相應(yīng)實(shí)例的地址傳遞給它們。

CRITICAL_SECTION結(jié)構(gòu)通過(guò)以下調(diào)用初始化:

void 初始化關(guān)鍵部分(PCRITICAL_SECTION 個(gè));

如果我們知道不再需要CRITICAL_SECTION結(jié)構(gòu),那么我們可以借助以下調(diào)用將其刪除:

無(wú)效刪除關(guān)鍵部分(PCRITICAL_SECTION個(gè));

使用共享資源的代碼區(qū)域應(yīng)先進(jìn)行以下調(diào)用:

無(wú)效的進(jìn)入臨界部分(PCRITICAL_SECTION個(gè));

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

bool 嘗試輸入關(guān)鍵部分(PCRITICAL_SECTION 個(gè));

TryEnterCriticalSection允許線程檢查資源可訪問(wèn)性,并在無(wú)法訪問(wèn)時(shí)參與另一個(gè)活動(dòng)。在成功的情況下(函數(shù)返回TRUE),很明顯結(jié)構(gòu)元素已更新,資源已鎖定。

在使用共享資源的代碼區(qū)域末尾,應(yīng)始終存在以下調(diào)用:

void LeaveCriticalSection(PCRITICAL_SECTION pcs);


LeaveCriticalSection檢查CRITICAL_SECTION結(jié)構(gòu)元素,并將資源鎖定計(jì)數(shù)器 (LockCount) 減少 1。

類(lèi)似于 Linux 操作系統(tǒng)中的CRITICAL_SECTION是可變互斥pthread_mutex_t。在使用之前,需要初始化此變量 – 寫(xiě)入常量PTHREAD_MUTEX_INITIALIZER的值或調(diào)用pthread_mutex_init函數(shù)。

#include

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

要使用默認(rèn)屬性值初始化互斥鎖,必須將NULL傳遞給attr屬性??梢栽趲椭?yè)面上找到特定的互斥鎖屬性值。

可以通過(guò)以下調(diào)用刪除互斥鎖:

int pthread_mutex_destroy(pthread_mutex_t *mutex);


通過(guò)調(diào)用pthread_mutex_lock函數(shù)鎖定互斥鎖:

int pthread_mutex_lock(pthread_mutex_t *mutex);


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

int pthread_mutex_unlock(pthread_mutex_t *mutex);


如果我們想檢查資源的可訪問(wèn)性,那么我們可以使用pthread_mutex_trylock函數(shù):

int pthread_mutex_trylock(pthread_mutex_t *mutex);


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

所有用于處理互斥鎖的函數(shù)在成功時(shí)返回 0,在失敗時(shí)返回錯(cuò)誤代碼。

讓我們總結(jié)一下。在 Windows 操作系統(tǒng)中,要使用共享資源,必須使用關(guān)鍵部分和特殊類(lèi)型的CRITICAL_SECTION。在 Linux 操作系統(tǒng)中,我們可以出于相同目的使用pthread_mutex_t類(lèi)型的互斥體。

同步功能記錄在表 4 中。

窗口函數(shù) Linux函數(shù)
初始化關(guān)鍵部分 pthread_mutex_init()
進(jìn)入關(guān)鍵部分 pthread_mutex_lock()
離開(kāi)關(guān)鍵部分 pthread_mutex_unlock()
嘗試進(jìn)入關(guān)鍵部分 pthread_mutex_trylock()
刪除關(guān)鍵部分 pthread_mutex_destroy()

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

螺紋端接

在實(shí)踐中,需要編寫(xiě)線程終止的情況之一是海量數(shù)據(jù)處理。當(dāng)主線程向所有線程發(fā)出退出信號(hào),但其中一個(gè)線程仍在處理信息時(shí),可能會(huì)出現(xiàn)這種情況。如果與信息丟失相比,及時(shí)性是應(yīng)用程序性能的更高優(yōu)先級(jí)因素,則需要退出線程并釋放系統(tǒng)資源。本節(jié)將介紹退出線程的方法。

線程可以通過(guò)以下方式退出:

線程函數(shù)返回

線程調(diào)用 ExitThread 函數(shù)

進(jìn)程的任何線程都調(diào)用 TerminateThread 函數(shù)

進(jìn)程的任何線程都調(diào)用 ExitProcess 函數(shù)

讓我們仔細(xì)看看其中的每一個(gè)。

線程函數(shù)返回。

干凈代碼的一個(gè)很好的例子是設(shè)計(jì)線程函數(shù),以便線程僅在函數(shù)返回后終止。在 Windows 操作系統(tǒng)中,這種線程終止方式保證正確清理線程擁有的資源。在 Linux 操作系統(tǒng)中,在線程可連接的情況下,必須調(diào)用其中一個(gè)連接函數(shù)。在一般情況下,會(huì)發(fā)生以下情況:

系統(tǒng)正確釋放線程占用的資源。

系統(tǒng)設(shè)置線程退出代碼。

此內(nèi)核對(duì)象 ?thread? 的用戶計(jì)數(shù)器減少 1。

在 Windows 操作系統(tǒng)中,可以通過(guò)調(diào)用以下內(nèi)容來(lái)強(qiáng)制終止線程:

void ExitThread(DWORD dwExitCode);

線程退出代碼值將添加到dwExitCode參數(shù)中。很容易注意到該函數(shù)沒(méi)有返回值,因?yàn)樵谡{(diào)用該函數(shù)后,線程將不復(fù)存在。

在Linux操作系統(tǒng)中,有一個(gè)完整的ExitThread模擬

void pthread_exit(void *rval_ptr);


參數(shù)rval_ptr表示包含返回值的非類(lèi)型指針。此指針可由調(diào)用pthread_join函數(shù)的其他進(jìn)程線程獲取。

函數(shù)調(diào)用pthread_join將線程帶到分離狀態(tài)。此狀態(tài)允許贏回線程資源。如果線程已處于分離狀態(tài),則調(diào)用pthread_join的線程將收到ESRCH錯(cuò)誤代碼。有時(shí),當(dāng)使用第二個(gè)非NULL參數(shù)調(diào)用pthread_join時(shí),可能會(huì)輸出分段錯(cuò)誤錯(cuò)誤。

進(jìn)程的任何線程都調(diào)用 TerminateThread 函數(shù)。

一個(gè)線程可以傳遞請(qǐng)求以強(qiáng)制終止同一進(jìn)程中的另一個(gè)線程。在Windows操作系統(tǒng)中,這是在以下功能的幫助下組織的:

bool TerminateThread(

HANDLE hThread,

DWORD dwExitCode

);

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

在 Linux 操作系統(tǒng)中,當(dāng)一個(gè)線程可以通過(guò)調(diào)用pthread_cancel函數(shù)傳遞強(qiáng)制終止同一進(jìn)程中另一個(gè)線程的請(qǐng)求時(shí),可以實(shí)現(xiàn)類(lèi)似的功能:

int pthread_cancel(pthread_t tid);

此函數(shù)需要與pthread_setcancelstate和pthread_setcanceltype函數(shù)結(jié)合使用。如果使用pthread_cancel,rval_ptr將被PTHREAD_CANCELED

讓我們仔細(xì)看看erminateThread和 Linux 操作系統(tǒng)中的類(lèi)似操作:

#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__

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11817

    瀏覽量

    219566
  • WINDOWS
    +關(guān)注

    關(guān)注

    4

    文章

    3706

    瀏覽量

    94330
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    510

    瀏覽量

    20872
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    逆風(fēng)C++QT中控臺(tái)逆向課程

    ,成為眾多應(yīng)用程序開(kāi)發(fā)的熱門(mén)選擇。尤其在工業(yè)系統(tǒng),QT的多線程處理能力和消息通信機(jī)制,為復(fù)雜業(yè)務(wù)邏輯的高效執(zhí)行提供了堅(jiān)實(shí)基礎(chǔ)。然而,當(dāng)
    的頭像 發(fā)表于 04-27 10:06 ?36次閱讀

    尋找對(duì)RISCV眾核并行計(jì)算感興趣的伙伴、朋友

    方便的處理“分支,遞歸,循環(huán)”。 2、能同時(shí)支持多個(gè)維度的并行:多核、硬件多線程、多發(fā)射。 3、調(diào)試簡(jiǎn)單:有類(lèi)似CPU的調(diào)試界面。 4、支持裸機(jī)(無(wú)操作系統(tǒng))下的并行編程,時(shí)序控制精準(zhǔn)
    發(fā)表于 03-28 14:41

    尋找對(duì)RISCV眾核并行計(jì)算感興趣的伙伴

    方便的處理“分支,遞歸,循環(huán)”。 2、能同時(shí)支持多個(gè)維度的并行:多核、硬件多線程、多發(fā)射。 3、調(diào)試簡(jiǎn)單:有類(lèi)似CPU的調(diào)試界面。 4、支持裸機(jī)(無(wú)操作系統(tǒng))下的并行編程,時(shí)序控制精準(zhǔn)
    發(fā)表于 03-28 14:37

    【瑞薩RA × Zephyr評(píng)測(cè)】多線程和看門(mén)狗

    本文章旨在評(píng)估使用 Zephyr RTOS 在 Renesas FPB-RA6E2 開(kāi)發(fā)板上實(shí)現(xiàn)多線程調(diào)度與硬件看門(mén)狗功能的應(yīng)用。評(píng)估內(nèi)容包括任務(wù)調(diào)度、看門(mén)狗初始化流程、主程序邏輯的詳細(xì)解析,以及實(shí)驗(yàn)現(xiàn)象與數(shù)據(jù)分析。
    的頭像 發(fā)表于 01-10 10:23 ?2665次閱讀
    【瑞薩RA × Zephyr評(píng)測(cè)】<b class='flag-5'>多線程</b>和看門(mén)狗

    解析Linux的進(jìn)程、線程和協(xié)程

    系統(tǒng)資源。線程的引入使得多核處理器得以充分利用,因?yàn)?b class='flag-5'>多線程程序可以更有效地分配和管理多核心的計(jì)算資源。 線程的特點(diǎn)包括: (1)共享
    發(fā)表于 12-22 11:00

    多線程系統(tǒng)

    ) { /* 無(wú)限循環(huán),不能返回 */ for (;;) { /* 線程實(shí)體 */ if (flag3) { } } } 相比前后臺(tái)系統(tǒng)后臺(tái)順序執(zhí)行的程序主體,在
    發(fā)表于 12-08 07:55

    Linux多線程對(duì)比單線程的優(yōu)勢(shì)

    Linux系統(tǒng)線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。線程被包含在進(jìn)程之中,是進(jìn)程
    發(fā)表于 12-01 06:11

    RK3588核心板/開(kāi)發(fā)板RT-Linux系統(tǒng)實(shí)時(shí)及硬件中斷延遲測(cè)試

    延遲檢測(cè)工具測(cè)試Linux系統(tǒng)實(shí)時(shí)。Cyclictest是一款專(zhuān)門(mén)用于測(cè)試和評(píng)估系統(tǒng)實(shí)時(shí)(Real-Time)的工具,主要用于測(cè)量
    的頭像 發(fā)表于 11-28 18:57 ?1020次閱讀
    RK3588核心板/開(kāi)發(fā)板RT-<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>實(shí)時(shí)<b class='flag-5'>性</b>及硬件中斷延遲測(cè)試

    rt-thread studio 如何進(jìn)行多線程編譯?

    ,使用的是5800h+32g內(nèi)存+sn550 ssd,開(kāi)啟16線程編譯時(shí)cpu的占用率也只能到30%,編譯完整個(gè)工程需要3分鐘 感覺(jué)多線程編譯設(shè)置沒(méi)有生效,有辦法提高編譯速度嗎 rtthread studio版本是 2.2.9
    發(fā)表于 10-11 09:16

    【HZ-T536開(kāi)發(fā)板免費(fèi)體驗(yàn)】—— linux創(chuàng)建線程

    任務(wù),并行是多個(gè)處理器或多核處理器同時(shí)執(zhí)行不同的任務(wù)。 Linux系統(tǒng)中進(jìn)行多線程編程時(shí),會(huì)涉及到主線程和子
    發(fā)表于 09-01 21:31

    UVC+MSC實(shí)現(xiàn)MSC線程未運(yùn)行的原因?

    線程結(jié)構(gòu) */ \"30:UVC_app_thread\" , /* 線程 ID 和名稱 */ CyCx3UvcAppThread_Entry , /* UVC 應(yīng)用程序線程入口
    發(fā)表于 07-16 07:08

    多線程的安全注意事項(xiàng)

    多線程安全是指多個(gè)線程同時(shí)訪問(wèn)或修改共享資源時(shí),能夠保證程序的正確和可靠。 開(kāi)發(fā)者選擇TaskPool或Worker進(jìn)行
    發(fā)表于 06-20 07:49

    龍芯處理器支持WINDOWS嗎?

    )。 Windows的適配:微軟官方僅支持x86/x64和ARM架構(gòu)的處理器,未推出針對(duì)LoongArch或MIPS的Windows版本。 技術(shù)限制 指令集不兼容:Windows系統(tǒng)
    發(fā)表于 06-05 14:24

    使用Percepio View免費(fèi)跟蹤工具分析Zephyr應(yīng)用

    Percepio View免費(fèi)跟蹤工具現(xiàn)在可以針對(duì)Zephyr應(yīng)用程序進(jìn)行跟蹤和可視化分析了。Percepio View可以幫助開(kāi)發(fā)人員理解和調(diào)試Zephyr的固定優(yōu)先級(jí)的多線程行為及復(fù)雜的
    的頭像 發(fā)表于 05-27 15:08 ?1000次閱讀
    使用Percepio View免費(fèi)跟蹤工具分析Zephyr應(yīng)用

    Linux主要的性能有哪些?

    ? 什么是Linux? ? Linux是一套自由傳播的類(lèi)Unix操作系統(tǒng),是一個(gè)基于posix和unix的多用戶、多任務(wù)、支持多線程和多cpu的操作
    的頭像 發(fā)表于 04-30 18:09 ?785次閱讀
    <b class='flag-5'>Linux</b>主要的性能有哪些?
    黎城县| 环江| 同江市| 金门县| 长汀县| 应城市| 常宁市| 当阳市| 十堰市| 金山区| 措勤县| 英德市| 慈溪市| 盐山县| 洛川县| 十堰市| 东海县| 宕昌县| 广水市| 高平市| 琼结县| 华安县| 高台县| 湖州市| 韩城市| 宜兴市| 绥阳县| 金山区| 康马县| 临江市| 永州市| 历史| 肥东县| 文山县| 闸北区| 丘北县| 长春市| 常德市| 莎车县| 神池县| 应城市|