线程使用
嵌入式中線程應用還是看需求,一般不常用(在不會使用的情況下)
一、編譯有線程的應用程序需要編譯時指定編譯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、非分離模式
當我們使用系統默認的線程處理模式時,一不小心就會導致內存泄漏的問題。
例如:
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);
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 線程好用,但要慎用,別出問題都不知道在哪兒出錯了。
好了,就先簡單說一下吧,歡迎指出問題,共同進步!
一、編譯有線程的應用程序需要編譯時指定編譯lib庫 ( -l pthread) 如:gcc main.c -o main -l pthread 才能編譯通過。
二、線程使用。
1、線程運行時有分離模式和非分離模式。
簡單一點說分離模式就是,把線程和自己所在的進程中分離出去,由系統去分出時間片去執行線程,此時主進程會繼續向下執行。
而非分離模式是等待線程執行完畢后,進程會繼續向下執行。
而在創建線程后系統默認的都是非分離模式的,so 需要設置分離模式時需要特定的設置才可以。
2、設置分離模式
方法一、通過設置線程分離模式的屬性使線程分離執行(實時性好)
方法二、設置分離屬性,使線程同步(實時性好)
問題:線程創建后,進程使用內存一下會增大8M以上,原因是系統創建線程后,會分配出8M 大小的線程運行緩存,但是有時候在設置分離模式后,而且確定線程已經運行完畢了,這8M內存還是沒有釋放,這大概是系統并未回收這個線程空間,預備下次創建線程,直接使用此線程的空間,也許就是系統的一個優化功能,此處不過多揣摩,了解一下就好。
線程的8M空間在整個進程結束后會完全釋放,再次啟動進程后,運行到創建線程時,此進程才會增加8M的運行空間。
3、非分離模式
當我們使用系統默認的線程處理模式時,一不小心就會導致內存泄漏的問題。
例如:
例1、非分離模式創建后,沒注意回收資源,導致內存泄漏
如果一定要用非分離模式那么就需要加入回收資源的的函數。pthread_join(tid, &status);
例1、非分離模式創建后,沒注意回收資源,導致內存泄漏
好了,就先簡單說一下吧,歡迎指出問題,共同進步!
總結
- 上一篇: Unix环境高级编程学习笔记(七) 多线
- 下一篇: 线程同步机制:互斥量、信号量、读写锁、条