資源描述:
《linux操作系統(tǒng)-實(shí)驗(yàn)五-linux 多線程編程》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、《操作系統(tǒng)》實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)序號:5 實(shí)驗(yàn)項(xiàng)目名稱:Linux多線程編程學(xué) 號姓 名專業(yè)、班實(shí)驗(yàn)地點(diǎn)指導(dǎo)教師實(shí)驗(yàn)時(shí)間2015.10.13一、實(shí)驗(yàn)?zāi)康募耙笸ㄟ^本實(shí)驗(yàn)的學(xué)習(xí),使學(xué)生掌握Linux多線程編程的基本方法。以學(xué)生自主訓(xùn)練為主的開放模式組織教學(xué)二、實(shí)驗(yàn)設(shè)備(軟硬件環(huán)境)及要求安裝有Ubuntu系統(tǒng)的VMWare三、實(shí)驗(yàn)內(nèi)容與步驟實(shí)驗(yàn)內(nèi)容:利用Linux多線程實(shí)現(xiàn)題目所要求的功能。實(shí)驗(yàn)步驟:1、根據(jù)教材實(shí)踐Linux線程管理指令2、利用Linux多線程編程實(shí)現(xiàn)以下功能:創(chuàng)建兩個(gè)子進(jìn)程;一個(gè)子線程(生產(chǎn)者線程)依次向緩沖區(qū)寫入整數(shù)0,1,2,.
2、..,19;另一個(gè)子線程(消費(fèi)者線程)暫停3s后,從緩沖區(qū)讀數(shù),每次讀一個(gè),并將讀出的數(shù)字從緩沖區(qū)刪除,然后將數(shù)字顯示出來;父線程等待子線程2(消費(fèi)者線程)的退出信息,待收集到該信息后,父線程就返回。四、實(shí)驗(yàn)結(jié)果、數(shù)據(jù)處理與過程截圖實(shí)驗(yàn)結(jié)果如下:用gcc編譯的時(shí)候需要加-lpthread,否則會出現(xiàn)以下錯(cuò)誤:五、思考題多進(jìn)程編程與多線程編程有何區(qū)別?相同點(diǎn):Linux下不管是多線程編程還是多進(jìn)程編程,最終都是用do_fork實(shí)現(xiàn)不同點(diǎn):父子進(jìn)程變量是互不影響的,由于父子進(jìn)程地址空間是完全隔開的,變量的地址可以是完全相同的。Linux下編程多用多進(jìn)程編程少用多線程編
3、程。多線程比多進(jìn)程成本低,但性能更低:多進(jìn)程是立體交通系統(tǒng),雖然造價(jià)高,上坡下坡多耗點(diǎn)油,但是不;多線程是平面交通系統(tǒng),造價(jià)低,但紅綠燈太多,老堵車。1、多進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品。子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品。2、多線程:相對與進(jìn)程而言,線程是一個(gè)更加接近與執(zhí)行體的概念,它可以與同進(jìn)程的其他線程共享數(shù)據(jù),但擁有自己的??臻g,擁有獨(dú)立的執(zhí)行序列。兩者都可以提高程序的并發(fā)度,提高程序運(yùn)行效率和響應(yīng)時(shí)間。3、線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源管理和保護(hù);而進(jìn)程正相反。同時(shí),線程適合于在5MP機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移。六
4、、教師評語成績簽名:日期:代碼:#include#include#include#include#includecharglobe_buffer[100];void*read_buffer_thread(void*arg);intmain(){intres,i;pthread_tread_thread;for(i=0;i<20;i++)globe_buffer[i]=i;printf("xianchengthread:writebufferfinish");
5、sleep(3);res=pthread_create(&read_thread,NULL,read_buffer_thread,NULL);if(res!=0){printf("ReadThreadcreatError!");exit(0);}sleep(1);printf("waitingforreadthreadtofinish...");res=pthread_join(read_thread,NULL);if(res!=0){printf("readthreadjoinfailed!");exit(0);}printf("readthreadxi
6、anchengOK,havefun!!exitByeBye");return0;}void*read_buffer_thread(void*arg){inti,x;printf("Readbufferthreadreaddata:");for(i=0;i<20;i++){x=globe_buffer[i];printf("%d",x);globe_buffer[i]=0;}printf("readover");}