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

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

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

3天內不再提示

Linux的C編程中多線程如何終止某個線程示例與要點

FPGA之家 ? 來源:CSDN技術社區 ? 作者:老吳的嵌入式之旅 ? 2021-04-27 13:41 ? 次閱讀

示例 demo

最簡單的 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);

}

為了突出重點,省略了檢查返回值。

運行效果:

thread1 0

thread1 1

thread1 2

thread1 was terminate by cancel

主線程先創建線程 thread1,然后睡眠 3 秒后發出終止 thread1 的請求。

接收到終止請求后,thread1 會在合適的時機被終止掉。

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

幾個要點

線程終止的 4 種方式:

線程的執行函數返回了,這和 main() 函數結束類似。

線程調用了 pthread_exit() 函數,這和調用 exit() 返回類似。

線程被另一個線程通過 pthread_cancel() 函數取消,這和通過kill() 發送 SIGKILL 信號類似。

進程終止了,則進程中的所有線程也會終止。

取消某個線程的常規步驟

被取消的線程:

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

PTHREAD_CANCEL_ENABLE,這是默認值;

PTHREAD_CANCEL_DISABLE;

設置取消類型,pthread_setcanceltype(),參數可選值:

PTHREAD_CANCEL_ASYNCHRONOUS,異步方式,當發出取消請求后,線程可能會在任何點被殺死。

PTHREAD_CANCEL_DEFERRED,延遲方式,線程只會在特定的取消點(cancellation points,調用某個函數前)被殺死。

發起取消的線程:

發送取消要求,pthread_cancel(),發出取消請求后,pthread_cancel() 當即返回,不會等待目標線程的退出。

等待取消完成,pthread_join()。

哪些函數是取消點?

POSIX.1 指定了哪些函數一定是取消點:

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

更多關于取消點的介紹:

$ man 7 pthreads

Cancellation points

。..

accept()

aio_suspend()

clock_nanosleep()

close()

。..

閱讀開源軟件 MJPG-streamer

MJPG-streamer 是什么?

簡單地說,就是一個開源的流媒體服務器:

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

通過 mjpg-streamer,你可以通過 PC 瀏覽器訪問到板子上的攝像頭圖像。

MJPG-streamer 是如何結束工作線程的?

MJPG-streamer 運行時一般會有 3 個線程:

主線程;

負責數據的輸入的線程 (例如 camera capture thread);

負責輸出數據的線程 (例如 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() 用于注冊清理函數到棧中,當線程遭取消時,會沿該棧自頂向下依次執行清理函數。

當用戶通過按下 ctrl + c 要求結束程序時,主線程會要求殺掉 http server thread 等各種線程:

static void signal_handler(int sig)

{

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

。..

pthread_cancel(servers[id].threadID);

。..

}

}

接下來,當 http server thread 遇到某個取消點時,server_cleanup() 會被調用以完成清理工作。

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

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

    關注

    87

    文章

    11319

    瀏覽量

    209830
  • 多線程
    +關注

    關注

    0

    文章

    278

    瀏覽量

    20016
  • c編程
    +關注

    關注

    0

    文章

    94

    瀏覽量

    29366

原文標題:Linux-C編程 / 多線程 / 如何終止某個線程?

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    socket 多線程編程實現方法

    在現代網絡編程,多線程技術被廣泛應用于提高服務器的并發處理能力。Socket編程是網絡通信的基礎,而將多線程技術應用于Socket
    的頭像 發表于 11-12 14:16 ?397次閱讀

    Python多線程和多進程的區別

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

    一文掌握Python多線程

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

    ESP32會不會有多線程問題,需要加鎖嗎?

    ESP32會不會有多線程問題,需要加鎖嗎
    發表于 07-19 08:05

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

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

    鴻蒙開發:【線程模型】

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

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

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

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

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

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程I/O密集型任務開發

    使用異步并發可以解決單次I/O任務阻塞的問題,但是如果遇到I/O密集型任務,同樣會阻塞線程其它任務的執行,這時需要使用多線程并發能力來進行解決。 I/O密集型任務的性能重點通常不在于CPU的處理
    發表于 03-21 14:57

    java實現多線程的幾種方式

    Java實現多線程的幾種方式 多線程是指程序包含了兩個或以上的線程,每個線程都可以并行執行不同的任務或操作。Java
    的頭像 發表于 03-14 16:55 ?738次閱讀

    python5種線程鎖盤點

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

    AT socket可以多線程調用嗎?

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

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

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

    linux多線程編程實例

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

    Redis7單線程多線程詳解

    主要是指Redis的網絡IO和鍵值對讀寫是由一個線程來完成的。
    的頭像 發表于 01-16 17:33 ?1872次閱讀
    Redis7單<b class='flag-5'>線程</b>與<b class='flag-5'>多線程</b>詳解
    主站蜘蛛池模板: 男女性杂交内射妇女BBWXZ | 丰满人妻妇伦又伦精品APP国产| 亚洲精品一线二线三线无人区 | 99国内精品久久久久久久清纯| 亚洲AV无码国产精品色午夜情| 爽娇妻快高h| 少妇久久久久久被弄高潮| 日本色高清| 日本丝袜护士| 日本夜夜夜| 色大姐综合网| 谁有成人网站地址| 无码乱人伦一区二区亚洲一| 忘忧草在线影院WWW日本动漫| 色尼玛亚洲综合| 四川少妇大战4黑人| 午夜视频在线网站| 亚洲 日本 中文字幕 制服| 香蕉鱼视频观看在线视频下载| 午夜福利院电影| 亚洲AV久久无码精品九九软件| 亚洲第一国产| 亚洲免费三区| 伊人大香线蕉精品在线播放| 与嫂子同居的日子在线观看| 中国欧美日韩一区二区三区| 777黄色片| 把腿张开再深点好爽宝贝| 高清国产激情视频在线观看| 国产精品第3页| 国产自产视频在线观看香蕉| 久久观看视频| 女教师の诱惑| 色久天| 亚洲AV色香蕉一区二区9255| 伊人青青草原| 99久酒店在线精品2019| 成年人视频免费在线播放| 国产精品成人影院在线观看| 精子网久久国产精品| 女人被躁到高潮嗷嗷叫免费|