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

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

    文章

    11499

    瀏覽量

    213344
  • 多線程
    +關注

    關注

    0

    文章

    279

    瀏覽量

    20387
  • c編程
    +關注

    關注

    0

    文章

    94

    瀏覽量

    29579

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深度剖析 RT-Thread 線程調度流程

    rt_system_scheduler_start:調度系統第一個線程rt_hw_context_switch_to:初始化上下文切換環境,觸發PendSV異常first_thread:系統優先級最高
    的頭像 發表于 06-25 18:24 ?633次閱讀
    深度剖析 RT-Thread <b class='flag-5'>線程</b>調度流程

    多線程的安全注意事項

    多線程安全是指多個線程同時訪問或修改共享資源時,能夠保證程序的正確性和可靠性。 開發者選擇TaskPool或Worker進行多線程開發時,在TaskPool和Worker的工作線程中導
    發表于 06-20 07:49

    鴻蒙5開發寶藏案例分享---跨線程性能優化指南

    ;>Worker</span>做多線程開發時,總遇到對象跨線程卡頓的問題,原來鴻蒙早就提供了解決方案。下面結合代碼和實戰案例,帶你徹底玩轉性能優化! 一、痛點:跨線程
    發表于 06-12 17:13

    工控一體機多線程任務調度優化:聚徽分享破解工業復雜流程高效協同密碼

    在當今工業 4.0 的浪潮下,工業生產正朝著高度自動化、智能化的方向大步邁進。生產流程日益復雜,眾多任務需要同時、高效地協同執行,這對工業控制系統的核心 —— 工控一體機提出了前所未有的挑戰。多線程
    的頭像 發表于 05-28 14:06 ?145次閱讀

    摩爾線程Linux驅動v3.0.0發布

    近日,摩爾線程正式推出Linux驅動程序v3.0.0,全面支持圖形顯卡MTT S80和高性能專業顯卡MTT X300。作為v2.7.0RC4之后的重大升級版本,本次更新實現了多項關鍵技術突破:在架構
    的頭像 發表于 05-08 11:38 ?445次閱讀
    摩爾<b class='flag-5'>線程</b><b class='flag-5'>Linux</b>驅動v3.0.0發布

    進程、線程、協程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    外賣員(線程C):負責送外賣他們共用: 原料冰箱(共享內存) 工作臺(棧空間)但不共享: 自己的工牌(線程ID) 心情日記(線程本地存儲) 代碼
    發表于 03-26 09:27

    請問如何在Python實現多線程與多進程的協作?

    大家好!我最近在開發一個Python項目時,需要同時處理多個任務,且每個任務需要不同的計算資源。我想通過多線程和多進程的組合來實現并發,但遇到了一些問題。 具體來說,我有兩個任務,一個是I/O密集型
    發表于 03-11 06:57

    請問rt-thread studio如何進行多線程編譯?

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

    socket 多線程編程實現方法

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

    摩爾線程完成股改,籌備上市

    近日,摩爾線程智能科技(北京)股份有限公司(簡稱“摩爾線程”)宣布已完成股改,并正積極籌備上市。據國家企業信用信息公示系統最新查詢結果顯示,摩爾線程的市場主體類型在10月28日已從其他有限責任公司
    的頭像 發表于 11-12 14:15 ?1127次閱讀

    一文搞懂Linux進程的睡眠和喚醒

    機制 1)信號(Signal): 進程可以通過接受特定信號被喚醒。 2)條件變量(Condition Variable): 多線程編程中用于同步多個線程的工具,可以讓一個線程在某些
    發表于 11-04 15:15

    Python多線程和多進程的區別

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

    CPU線程和程序線程的區別

    CPU的線程與程序的線程在概念、作用、實現方式以及性能影響等方面存在顯著差異。以下是對兩者區別的詳細闡述,旨在深入探討這一技術話題。
    的頭像 發表于 09-02 11:18 ?2064次閱讀

    一文掌握Python多線程

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

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

    ESP32會不會有多線程問題,需要加鎖嗎
    發表于 07-19 08:05
    主站蜘蛛池模板: 亚洲qingse | 5060午夜一级| 久久99精品久久久久久牛牛影视 | 美女视频黄a视频美女大全 美女视频一区二区 | 欧美影欧美影院免费观看视频 | 一区二区三区亚洲 | 天天干天天插天天射 | 亚洲性人人天天夜夜摸 | 国产视频精品久久 | 草色网| 中国胖女人一级毛片aaaaa | 岛国大片在线播放 | 在线视频免费观看 | 色多多·com| 天天操天天爽天天射 | 在线天堂网www资源种子 | 不卡一级毛片免费高清 | 人人澡人人人人夜夜爽 | 天天干天天操天天 | 天天欧美| 天天草比 | 亚洲午夜日韩高清一区 | 国产h视频在线观看 | 人人搞人人爱 | 亚洲综合激情丁香六月 | 91大神视频网站 | 免费视频淫片aa毛片 | 亚洲综合色视频 | 亚洲日韩图片专区第1页 | 欧美爱爱帝国综合社区 | 日本黄色片www | 国产精品视频久久久久 | 久久综合九色综合97婷婷群聊 | 人人干人人做 | 一本到在线观看视频不卡 | 亚洲黄网站wwwwww | 四虎国产成人亚洲精品 | 成年午夜一级毛片视频 | 日韩伦 | 天堂看动漫 | 久久精品免费 |