在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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的C編程中多線程如何終止某個(gè)線程示例與要點(diǎn)

FPGA之家 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:老吳的嵌入式之旅 ? 2021-04-27 13:41 ? 次閱讀

示例 demo

最簡(jiǎn)單的 demo:

static void* thread1_func(void *arg)

{

int i = 0;

// able to be cancel

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);

pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);

for(i=0; ; i++) {

printf(“thread1 %d

”, i);

sleep(1);

}

}

int main(int argc, char **argv)

{

pthread_t t;

void *res;

pthread_create(&t, NULL, thread1_func, NULL);

sleep(3);

pthread_cancel(t); // cancel thread1

pthread_join(t, &res); // wait thread1

if (res == PTHREAD_CANCELED

printf(“thread1 was terminate by cancel

”);

else

printf(“thread1 was not terminate by cancel

”);

exit(EXIT_SUCCESS);

}

為了突出重點(diǎn),省略了檢查返回值。

運(yùn)行效果:

thread1 0

thread1 1

thread1 2

thread1 was terminate by cancel

主線程先創(chuàng)建線程 thread1,然后睡眠 3 秒后發(fā)出終止 thread1 的請(qǐng)求。

接收到終止請(qǐng)求后,thread1 會(huì)在合適的時(shí)機(jī)被終止掉。

主線程通過(guò) pthread_join() 阻塞等待 thread1 退出。

幾個(gè)要點(diǎn)

線程終止的 4 種方式:

線程的執(zhí)行函數(shù)返回了,這和 main() 函數(shù)結(jié)束類(lèi)似。

線程調(diào)用了 pthread_exit() 函數(shù),這和調(diào)用 exit() 返回類(lèi)似。

線程被另一個(gè)線程通過(guò) pthread_cancel() 函數(shù)取消,這和通過(guò)kill() 發(fā)送 SIGKILL 信號(hào)類(lèi)似。

進(jìn)程終止了,則進(jìn)程中的所有線程也會(huì)終止。

取消某個(gè)線程的常規(guī)步驟

被取消的線程:

允許取消,pthread_setcancelstate(),參數(shù)可選值:

PTHREAD_CANCEL_ENABLE,這是默認(rèn)值;

PTHREAD_CANCEL_DISABLE;

設(shè)置取消類(lèi)型,pthread_setcanceltype(),參數(shù)可選值:

PTHREAD_CANCEL_ASYNCHRONOUS,異步方式,當(dāng)發(fā)出取消請(qǐng)求后,線程可能會(huì)在任何點(diǎn)被殺死。

PTHREAD_CANCEL_DEFERRED,延遲方式,線程只會(huì)在特定的取消點(diǎn)(cancellation points,調(diào)用某個(gè)函數(shù)前)被殺死。

發(fā)起取消的線程:

發(fā)送取消要求,pthread_cancel(),發(fā)出取消請(qǐng)求后,pthread_cancel() 當(dāng)即返回,不會(huì)等待目標(biāo)線程的退出。

等待取消完成,pthread_join()。

哪些函數(shù)是取消點(diǎn)?

POSIX.1 指定了哪些函數(shù)一定是取消點(diǎn):

6db9b9f8-a67e-11eb-aece-12bb97331649.png

更多關(guān)于取消點(diǎn)的介紹:

$ man 7 pthreads

Cancellation points

。..

accept()

aio_suspend()

clock_nanosleep()

close()

。..

閱讀開(kāi)源軟件 MJPG-streamer

MJPG-streamer 是什么?

簡(jiǎn)單地說(shuō),就是一個(gè)開(kāi)源的流媒體服務(wù)器:

https://github.com/jacksonliam/mjpg-streamer

通過(guò) mjpg-streamer,你可以通過(guò) PC 瀏覽器訪問(wèn)到板子上的攝像頭圖像。

MJPG-streamer 是如何結(jié)束工作線程的?

MJPG-streamer 運(yùn)行時(shí)一般會(huì)有 3 個(gè)線程:

主線程;

負(fù)責(zé)數(shù)據(jù)的輸入的線程 (例如 camera capture thread);

負(fù)責(zé)輸出數(shù)據(jù)的線程 (例如 http server thread)。

以 http server thread 為例:

plugins/output_http/httpd.c

void *server_thread(void *arg)

{

。..

pthread_cleanup_push(server_cleanup, pcontext);

// 處理連接

while(!pglobal-》stop) {

。..

}

pthread_cleanup_pop(1);

}

pthread_cleanup_push() 用于注冊(cè)清理函數(shù)到棧中,當(dāng)線程遭取消時(shí),會(huì)沿該棧自頂向下依次執(zhí)行清理函數(shù)。

當(dāng)用戶(hù)通過(guò)按下 ctrl + c 要求結(jié)束程序時(shí),主線程會(huì)要求殺掉 http server thread 等各種線程:

static void signal_handler(int sig)

{

for(i = 0; i 《 global.outcnt; i++) {

。..

pthread_cancel(servers[id].threadID);

。..

}

}

接下來(lái),當(dāng) http server thread 遇到某個(gè)取消點(diǎn)時(shí),server_cleanup() 會(huì)被調(diào)用以完成清理工作。

這里只是簡(jiǎn)單地分析一下,MJPG-Streamer 里多線程相關(guān)的代碼挺復(fù)雜的,有興趣的小伙伴們自行閱讀吧。
編輯:lyn

聲明:本文內(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)注

    87

    文章

    11406

    瀏覽量

    212080
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    279

    瀏覽量

    20198
  • c編程
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    29499

原文標(biāo)題:Linux-C編程 / 多線程 / 如何終止某個(gè)線程?

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    進(jìn)程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    外賣(mài)員(線程C):負(fù)責(zé)送外賣(mài)他們共用: 原料冰箱(共享內(nèi)存) 工作臺(tái)(棧空間)但不共享: 自己的工牌(線程ID) 心情日記(線程本地存儲(chǔ)) 代碼
    發(fā)表于 03-26 09:27

    請(qǐng)問(wèn)如何在Python實(shí)現(xiàn)多線程與多進(jìn)程的協(xié)作?

    大家好!我最近在開(kāi)發(fā)一個(gè)Python項(xiàng)目時(shí),需要同時(shí)處理多個(gè)任務(wù),且每個(gè)任務(wù)需要不同的計(jì)算資源。我想通過(guò)多線程和多進(jìn)程的組合來(lái)實(shí)現(xiàn)并發(fā),但遇到了一些問(wèn)題。 具體來(lái)說(shuō),我有兩個(gè)任務(wù),一個(gè)是I/O密集型
    發(fā)表于 03-11 06:57

    請(qǐng)問(wèn)rt-thread studio如何進(jìn)行多線程編譯?

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

    socket 多線程編程實(shí)現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程多線程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應(yīng)用于Socket
    的頭像 發(fā)表于 11-12 14:16 ?727次閱讀

    Python多線程和多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見(jiàn)的兩種方式之一。在本文中,我們將探討Python多線程
    的頭像 發(fā)表于 10-23 11:48 ?769次閱讀
    Python<b class='flag-5'>中</b><b class='flag-5'>多線程</b>和多進(jìn)程的區(qū)別

    CPU線程和程序線程的區(qū)別

    CPU的線程與程序的線程在概念、作用、實(shí)現(xiàn)方式以及性能影響等方面存在顯著差異。以下是對(duì)兩者區(qū)別的詳細(xì)闡述,旨在深入探討這一技術(shù)話(huà)題。
    的頭像 發(fā)表于 09-02 11:18 ?1685次閱讀

    一文掌握Python多線程

    使用線程可以把占據(jù)長(zhǎng)時(shí)間的程序的任務(wù)放到后臺(tái)去處理。
    的頭像 發(fā)表于 08-05 15:46 ?1096次閱讀

    ESP32會(huì)不會(huì)有多線程問(wèn)題,需要加鎖嗎?

    ESP32會(huì)不會(huì)有多線程問(wèn)題,需要加鎖嗎
    發(fā)表于 07-19 08:05

    多線程設(shè)計(jì)模式到對(duì) CompletableFuture 的應(yīng)用

    最近在開(kāi)發(fā) 延保服務(wù) 頻道頁(yè)時(shí),為了提高查詢(xún)效率,使用到了多線程技術(shù)。為了對(duì)多線程方案設(shè)計(jì)有更加充分的了解,在業(yè)余時(shí)間讀完了《圖解 Java 多線程設(shè)計(jì)模式》這本書(shū),覺(jué)得收獲良多。本篇文章將介紹其中
    的頭像 發(fā)表于 06-26 14:18 ?529次閱讀
    從<b class='flag-5'>多線程</b>設(shè)計(jì)模式到對(duì) CompletableFuture 的應(yīng)用

    鴻蒙開(kāi)發(fā):線程模型

    FA模型下的線程主要有如下三類(lèi)
    的頭像 發(fā)表于 06-24 17:27 ?586次閱讀
    鴻蒙開(kāi)發(fā):<b class='flag-5'>線程</b>模型

    探索虛擬線程:原理與實(shí)現(xiàn)

    虛擬線程的引入與優(yōu)勢(shì) 在Loom項(xiàng)目之前,Java虛擬機(jī)(JVM)線程是通過(guò)java.lang.Thread類(lèi)型來(lái)實(shí)現(xiàn)的,這些線程被稱(chēng)為平臺(tái)線程
    的頭像 發(fā)表于 06-24 11:35 ?465次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實(shí)現(xiàn)

    鴻蒙開(kāi)發(fā):【線程模型】

    管理其他線程的ArkTS引擎實(shí)例,例如使用TaskPool(任務(wù)池)創(chuàng)建任務(wù)或取消任務(wù)、啟動(dòng)和終止Worker線程
    的頭像 發(fā)表于 06-13 16:38 ?585次閱讀
    鴻蒙開(kāi)發(fā):【<b class='flag-5'>線程</b>模型】

    動(dòng)態(tài)線程池思想學(xué)習(xí)及實(shí)踐

    ://www.javadoop.com/post/java-thread-pool? 引言 在后臺(tái)項(xiàng)目開(kāi)發(fā)過(guò)程,我們常常借助線程池來(lái)實(shí)現(xiàn)多線程任務(wù),以此提升系統(tǒng)的吞吐率和響應(yīng)性;而線程
    的頭像 發(fā)表于 06-13 15:43 ?1362次閱讀
    動(dòng)態(tài)<b class='flag-5'>線程</b>池思想學(xué)習(xí)及實(shí)踐

    bootloader開(kāi)多線程做引導(dǎo)程序,跳app初始化后直接進(jìn)hardfualt,為什么?

    如標(biāo)題,想做一個(gè)遠(yuǎn)程升級(jí)的項(xiàng)目,bootloader引導(dǎo)區(qū)域和app都是開(kāi)多線程跑的,就是自己寫(xiě)了個(gè)小的任務(wù)調(diào)度器,沒(méi)什么功能主要是想讓程序快速的響應(yīng),延時(shí)不會(huì)對(duì)其他程序造成堵塞,程序測(cè)試
    發(fā)表于 04-18 06:07

    使用cubeIDE配置的工程printf在FreeRTOS線程任務(wù)無(wú)法使用怎么解決?

    使用cubeIDE配置完工程后,對(duì)printf進(jìn)行了重映射,并且把例程的syscalls.c也拷貝到了工程,能夠使用printf輸出。但是如果加了FreeRTOS之后,在線程任務(wù)
    發(fā)表于 04-17 06:19
    主站蜘蛛池模板: 二区视频在线 | 四虎国产精品永久地址51 | 精品女同同性视频很黄很色 | 欧美人交性视频在线香蕉 | 国产成人av在线 | 色一情一乱一乱91av | 天天射日日射 | 久久久久久综合 | 最新欧美伦理网 | 天堂网www在线观看 天堂网www在线资源中文 | 玖玖精品国产 | 欧美成网站| 精品伊人久久大线蕉地址 | 亚洲欧美成人在线 | 又粗又大又猛又爽免费视频 | a成人毛片免费观看 | 日韩免费观看视频 | 天天色天天干天天射 | 亚洲国产一区二区三区a毛片 | 日韩欧美卡通动漫在线观看 | 四虎4hu| 亚洲第一网站快活影院 | 天天操天天干天天玩 | 天天操夜夜添 | 四虎影院在线播放 | 2018国产精品 | 五月天婷婷丁香 | 夜夜夜夜夜夜夜工噜噜噜 | 精品乱码一区二区三区四区 | 四虎永久在线精品免费影视 | 丁香婷婷在线观看 | 欧洲精品码一区二区三区免费看 | 天堂在线bt | 亚洲国产色婷婷精品综合在线观看 | 国产va免费精品高清在线观看 | 日韩一级欧美一级一级国产 | 中文字幕天堂在线 | 欧美日韩一区二区三区视视频 | 黄色录像日本 | 狠狠色丁香九九婷婷综合五月 | 青草久草视频 |