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