日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程使用

發布時間:2023/12/2 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
嵌入式中線程應用還是看需求,一般不常用(在不會使用的情況下)
一、編譯有線程的應用程序需要編譯時指定編譯lib庫 ( -l pthread) 如:gcc main.c -o main -l pthread 才能編譯通過。

二、線程使用。
1、線程運行時有分離模式和非分離模式。
簡單一點說分離模式就是,把線程和自己所在的進程中分離出去,由系統去分出時間片去執行線程,此時主進程會繼續向下執行。
而非分離模式是等待線程執行完畢后,進程會繼續向下執行。
而在創建線程后系統默認的都是非分離模式的,so 需要設置分離模式時需要特定的設置才可以。
2、設置分離模式
方法一、通過設置線程分離模式的屬性使線程分離執行(實時性好)


  • void process_printf()
  • {
  • ? ? sleep(1);
  • ? ? printf("sleep in thread\n");
  • }

  • int?main()
  • {
  • ????pthread_t thread_id;
  • ????int?ret;
  • ????pthread_attr_t attr;
  • ????pthread_attr_init(&attr);
  • ????pthread_attr_setdetachstate(&attr,?PTHREAD_CREATE_DETACHED);
  • ????ret?=?pthread_create(&thread_id,?&attr,?process_printf,?NULL)?;
  • ????pthread_attr_destroy(&attr);

  • ????return 1;
  • }


  • 方法二、設置分離屬性,使線程同步(實時性好)

  • void process_printf()
  • {
  • ??? //pthread_detach(pthread_self()); //method 1: 可以在線程中設置分離模式
  • ? ? sleep(1);
  • ? ? printf("sleep in thread \n");
  • }

  • int?down_or_up_to_cloud()
  • {
  • ????pthread_t thread_id;
  • ???????int?ret;
  • ?
  • ????ret?=?pthread_create(&thread_id,?NULL,?process_printf,?NULL)?;
  • ????pthread_detach(thread_id);?//method 2: 線程創建完畢設置分離模式?
  • ? ??
  • ????return 1;
  • }
  • 好處:設置分離模式后,線程在運行完畢后,系統會回收線程中的資源,這樣不會有內存泄漏的問題啦,可以放心使用。

    問題:線程創建后,進程使用內存一下會增大8M以上,原因是系統創建線程后,會分配出8M 大小的線程運行緩存,但是有時候在設置分離模式后,而且確定線程已經運行完畢了,這8M內存還是沒有釋放,這大概是系統并未回收這個線程空間,預備下次創建線程,直接使用此線程的空間,也許就是系統的一個優化功能,此處不過多揣摩,了解一下就好。
    線程的8M空間在整個進程結束后會完全釋放,再次啟動進程后,運行到創建線程時,此進程才會增加8M的運行空間。
    3、非分離模式
    當我們使用系統默認的線程處理模式時,一不小心就會導致內存泄漏的問題。
    例如:

    例1、非分離模式創建后,沒注意回收資源,導致內存泄漏

  • int?main()
  • {
  • ????pthread_t thread_id;
  • ? ??int?ret;

  • ????ret?=?pthread_create(&thread_id,?NULL,?process_one,?NULL)?;

  • ? ??ret?=?pthread_create(&thread_id,?NULL,?process_two,?NULL)?;
  • ? ? ?....
  • ? ??ret?=?pthread_create(&thread_id,?NULL,?process_N,?NULL)?;

  • ????return 1;
  • }
  • 上例在主進程中創建多個線程,或者在整個應用程序中需要不定時的去創建進程去處理事情,可以確定的是每創建一個線程系統會自動開辟8M的線程緩存,這樣不停的積累,內存會耗盡,導致內存泄漏。
    如果一定要用非分離模式那么就需要加入回收資源的的函數。pthread_join(tid, &status);

    例1、非分離模式創建后,沒注意回收資源,導致內存泄漏

  • int?main()
  • {
  • ????pthread_t thread_id_1,thread_id_2,thread_id_3...thread_id_n;
  • ? ??int?ret;

  • ????ret?=?pthread_create(&thread_id_1,?NULL,?process_one,?NULL)?;

  • ? ??ret?=?pthread_create(&thread_id_2,?NULL,?process_two,?NULL)?;
  • ? ? ?....
  • ? ??ret?=?pthread_create(&thread_id_n,?NULL,?process_N,?NULL)?;
  • ?????pthread_join(thread_id_1, NULL);
  • ? ? ??pthread_join(thread_id_2, NULL);
  • ? ? ??...
  • ? ? ??pthread_join(thread_id_n, NULL);
  • ????return 1;
  • }
  • 添加thread_join 函數是等待線程運行完畢后,然后回收資源的作用。so 線程好用,但要慎用,別出問題都不知道在哪兒出錯了。


    好了,就先簡單說一下吧,歡迎指出問題,共同進步!

    總結

    以上是生活随笔為你收集整理的线程使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。