資源描述:
《Linux多線程編程入門.ppt》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、多核程序設計Linux多線程編程2008年4月POSIX線程庫Pthreads介紹IEEEPOSIX標準p1003.1c(Pthreads)定義了處理線程的一系列C語言類型的API。在Linux中,線程一般被認為是“輕量級的進程”。Linux創(chuàng)建進程所使用的函數(shù)是fork()或者vfork()。而對線程的創(chuàng)建和管理Linux可以使用POSIX的線程庫pthreads提供的APIs。使用fork()創(chuàng)建進程和使用POSIX線程庫差別:使用fork()創(chuàng)建進程的特點:代價昂貴,通常子進程需要拷貝父進程的整個上下文,比如數(shù)據(jù)等。進程間的通信方式比較復雜,比如使用管道、
2、消息、共享內(nèi)存等方法。操作系統(tǒng)在實現(xiàn)進程間的切換比線程切換更費時。使用POSIXpthreads庫創(chuàng)建線程的特點:線程可使用存在于進程中的資源,因此創(chuàng)建進程比創(chuàng)建線程更快。線程間的通信方式更容易,比如通過進程中的變量,可以讓多個線程共享數(shù)據(jù)。操作系統(tǒng)對線程的切換比對進程的切換更容易和快速。POSIXpthreads庫線程的創(chuàng)建pthreads線程庫中提供的創(chuàng)建線程的函數(shù)是pthread_create()#includeintpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*
3、start_routine)(void*),void*arg);線程的退出在線程的處理函數(shù)中,可以顯示的調(diào)用pthread_exit()結(jié)束線程執(zhí)行,也可以不調(diào)用pthread_exit(),而只是讓線程處理程序返回。除了pthread_exit()函數(shù),可以讓當前調(diào)用pthread_exit()的線程顯示地退出外,線程也可以使用pthread_cancel()函數(shù)終止其他線程的執(zhí)行。POSIXpthreads庫(續(xù))等待線程結(jié)束pthread_join()函數(shù)會掛起創(chuàng)建線程的線程的執(zhí)行,直到等待到想要等待的子線程。intpthread_join(pthread
4、_tth,void**thread_return);線程的分離主線程創(chuàng)建子線程,且子線程本身自己有自我回收內(nèi)存資源的能力。intpthread_detach(pthread_tth);獲得當前線程標志使用pthread_self()函數(shù)可以獲得當前線程的標志,pthread_self()的返回值就是當前線程的標志。pthread_tpthread_self(void);使用Pthreads編寫的程序例子#include#include#include#include#defineTH
5、READ_NUMBER2intretval_hello1=2,retval_hello2=3;void*hello1(void*arg){char*hello_str=(char*)arg;sleep(1);printf("%s",hello_str);pthread_exit(&retval_hello1);}void*hello2(void*arg){char*hello_str=(char*)arg;sleep(2);printf("%s",hello_str);pthread_exit(&retval_hello2);}使用Pthreads編寫的
6、程序例子(續(xù))intmain(intargc,char*argv[]){inti;intret_val;int*retval_hello[2];pthread_tpt[THREAD_NUMBER];constchar*arg[THREAD_NUMBER];arg[0]="helloworldfromthread1";arg[1]="helloworldfromthread2";printf("Begintocreatethreads...");ret_val=pthread_create(&pt[0],NULL,hello1,(void*)arg[0]);i
7、f(ret_val!=0){printf("pthread_createerror!");exit(1);使用Pthreads編寫的程序例子(續(xù)2)ret_val=pthread_create(&pt[1],NULL,hello2,(void*)arg[1]);if(ret_val!=0){printf("pthread_createerror!");exit(1);}printf("Now,themainthreadreturns.");printf("Begintowaitforthreads...");for(i=0;i8、MBER;i++){re