




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)課程設(shè)計說明書 目 錄目 錄2用多線程同步方法解決生產(chǎn)者消費者問題41. 設(shè)計題目與要求41.1設(shè)計題目41.2設(shè)計要求42.設(shè)計思想及系統(tǒng)平臺42.1設(shè)計思想42.2系統(tǒng)平臺及使用語言53.數(shù)據(jù)結(jié)構(gòu)與模塊說明54.源程序清單75.運行結(jié)果與運行情況136.調(diào)試過程137.總結(jié)14本科生課程設(shè)計成績評定表15課程設(shè)計任務(wù)書學(xué)生姓名: 專業(yè)班級: 指導(dǎo)教師: 工作單位: 計算機科學(xué)與技術(shù)學(xué)院 題目: 用多線程同步方法解決生產(chǎn)者消費者問題 (producer-consumer problem) 初始條件:1 操作系統(tǒng):linux2 程序設(shè)計語言:c語言3 有界緩沖區(qū)內(nèi)設(shè)有20個存儲單元,其
2、初值為0。放入取出的數(shù)據(jù)項按增序設(shè)定為120這20個整型數(shù)。要求完成的主要任務(wù): (包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求) 1技術(shù)要求:1)為每個生產(chǎn)者消費者產(chǎn)生一個線程,設(shè)計正確的同步算法2)每個生產(chǎn)者和消費者對有界緩沖區(qū)進(jìn)行操作后,即時顯示有界緩沖區(qū)的當(dāng)前全部內(nèi)容、當(dāng)前指針位置和生產(chǎn)者消費者線程的自定義標(biāo)識符。3)生產(chǎn)者和消費者各有兩個以上。4)多個生產(chǎn)者或多個消費者之間須共享對緩沖區(qū)進(jìn)行操作的函數(shù)代碼。2 設(shè)計說明書內(nèi)容要求:1)設(shè)計題目與要求2)總的設(shè)計思想及系統(tǒng)平臺、語言、工具等。3)數(shù)據(jù)結(jié)構(gòu)與模塊說明(功能與流程圖)4)給出用戶名、源程序名、目標(biāo)程序名和源程序及
3、其運行結(jié)果。(要注明存儲各個程序及其運行結(jié)果的主機ip地址和目錄。)5)運行結(jié)果與運行情況(提示: (1)有界緩沖區(qū)可用數(shù)組實現(xiàn)。(2)編譯命令可用:cc -lpthread -o 目標(biāo)文件名源文件名(3)多線程編程方法參見附件。)3. 調(diào)試報告:1)調(diào)試記錄2)自我評析和總結(jié)上機時間安排:18周一 五 08:0 12:00 指導(dǎo)教師簽名: 年 月 日系主任(或責(zé)任教師)簽名: 年 月 日用多線程同步方法解決生產(chǎn)者消費者問題1. 設(shè)計題目與要求1.1設(shè)計題目 解決生產(chǎn)者消費者(bounded - buffer problem)問題1.2設(shè)計要求1) 每個生產(chǎn)者和消費者對有界緩沖區(qū)進(jìn)行操作后,即
4、時顯示有界緩沖區(qū)的全部內(nèi)容、當(dāng)前指針位置和生產(chǎn)者消費者線程的標(biāo)識符。2) 生產(chǎn)者和消費者各有兩個以上。3) 多個生產(chǎn)者或多個消費者之間須共享對緩沖區(qū)進(jìn)行操作的函數(shù)代碼。2.設(shè)計思想及系統(tǒng)平臺2.1設(shè)計思想生產(chǎn)者進(jìn)程與消費者進(jìn)程是經(jīng)典的同步互斥關(guān)系。系統(tǒng)創(chuàng)建兩類進(jìn)程:proceducer ()和consumer(),分別用來描述生產(chǎn)者和消費者的行為。生產(chǎn)者與消費者問題是指若干進(jìn)程通過循環(huán)緩沖池區(qū)交換數(shù)據(jù)。生產(chǎn)者進(jìn)程不斷向循環(huán)緩沖池區(qū)中寫入數(shù)據(jù)(即生產(chǎn)數(shù)據(jù)),而消費者進(jìn)程不斷從循環(huán)緩沖池區(qū)中讀出數(shù)據(jù)(即消費數(shù)據(jù))。循環(huán)緩沖池共有n個緩沖區(qū),緩沖區(qū)可以暫存一個產(chǎn)品,任何時刻只能有一個進(jìn)程可以對循環(huán)緩
5、沖池進(jìn)行操作。只要緩沖區(qū)未滿,生產(chǎn)者就可以把產(chǎn)品送入緩沖區(qū);只要緩沖區(qū)未空,消費者就可以從緩沖區(qū)中取走物品。為了解決生產(chǎn)者和消費者問題,應(yīng)該設(shè)置信號量和變量如下: full: 滿緩沖區(qū)資源信號量 ,初值為0;empty:空緩沖區(qū)資源信號量 ,初值為n;in: 生產(chǎn)者指針,初值均為0;out: 消費者指針,均為0;mutex:緩沖區(qū)操作的互斥信號量,初值為1利用互斥信號量mutex實現(xiàn)諸進(jìn)程對緩沖池的互斥使用,利用信號量empty和full分別表示緩沖池中空緩沖池和滿緩沖區(qū)的數(shù)量。2.2系統(tǒng)平臺及使用語言1)操作系統(tǒng):linux2)程序設(shè)計語言:c語言3)編譯器:gcc3.數(shù)據(jù)結(jié)構(gòu)與模塊說明3.
6、1程序自定義函數(shù)1、void produce(struct sem_info * );這個函數(shù)是生產(chǎn)者進(jìn)行的生產(chǎn)過程,為所有的生產(chǎn)者所共享。結(jié)構(gòu)體指針用來接收生產(chǎn)者線程創(chuàng)建時傳來的生產(chǎn)者的個人信息。2、void consumer(struct sem_info * );這個函數(shù)是消費者進(jìn)行的生產(chǎn)過程,為所有的消費者所共享。結(jié)構(gòu)體指針用來接收消費者線程創(chuàng)建時傳來的消費者的個人信息。3、void setproduce(void); 這個函數(shù)是用來設(shè)置生產(chǎn)者的個數(shù)和他們的名字。4、void setconsumer(void);這個函數(shù)是用來設(shè)置消費者的個數(shù)和他們的名字。5、void activept
7、hread(int);這個函數(shù)是用來創(chuàng)建生產(chǎn)者線程,int型參數(shù)為生產(chǎn)者的個數(shù)。6、void activecthread(int);這個函數(shù)是用來創(chuàng)建生產(chǎn)者線程,int型參數(shù)為生產(chǎn)者的個數(shù)。7、int gettime(void);這個函數(shù)返回來一個整數(shù),作為線程的sleep()函數(shù)的參數(shù)。8、void myscanf(void);這個函數(shù)用來獲取設(shè)置生產(chǎn)者和消費者的個數(shù)時的整數(shù),確保這個數(shù)字在0到max_buffer之間。3.2系統(tǒng)函數(shù)調(diào)用 線程linux系統(tǒng)下的多線程遵循posix線程接口,稱為pthread。編寫linux下的多線程程序,需要使用頭文件pthread.h,連接時需要使用庫l
8、ibpthread.a。linux下pthread的實現(xiàn)是通過系統(tǒng)調(diào)用clone()來實現(xiàn)的。clone()是linux所特有的系統(tǒng)調(diào)用,它的使用方式類似fork。函數(shù)pthread_create用來創(chuàng)建一個線程,它的原型為:extern int pthread_create _p (pthread_t *_thread, _const pthread_attr_t *_attr,void *(*_start_routine) (void *), void *_arg);第一個參數(shù)為指向線程標(biāo)識符的指針,第二個參數(shù)用來設(shè)置線程屬性,第三個參數(shù)是線程運行函數(shù)的起始地址,最后一個參數(shù)是運行函數(shù)的參
9、數(shù)。第二個參數(shù)我們也設(shè)為空指針,這樣將生成默認(rèn)屬性的線程。當(dāng)創(chuàng)建線程成功時,函數(shù)返回0,若不為0則說明創(chuàng)建線程失敗,常見的錯誤返回代碼為eagain和einval。前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數(shù)目過多了;后者表示第二個參數(shù)代表的線程屬性值非法。創(chuàng)建線程成功后,新創(chuàng)建的線程則運行參數(shù)三和參數(shù)四確定的函數(shù),原來的線程則繼續(xù)運行下一行代碼。函數(shù)pthread_join用來等待一個線程的結(jié)束。函數(shù)原型為:extern int pthread_join _p (pthread_t _th, void *_thread_return);第一個參數(shù)為被等待的線程標(biāo)識符,第二個參數(shù)為一個用戶定義的指
10、針,它可以用來存儲被等待線程的返回值。這個函數(shù)是一個線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程結(jié)束為止,當(dāng)函數(shù)返回時,被等待線程的資源被收回。一個線程的結(jié)束有兩種途徑,一種是函數(shù)結(jié)束了,調(diào)用它的線程也就結(jié)束了;另一種方式是通過函數(shù)pthread_exit來實現(xiàn)。它的函數(shù)原型為:extern void pthread_exit _p (void *_retval) _attribute_ (_noreturn_);唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個參數(shù)thread_return不是null,這個值將被傳遞給 thread_return。最后要說明的是,一
11、個線程不能被多個線程等待,否則第一個接收到信號的線程成功返回,其余調(diào)用pthread_join的線程則返回錯誤代碼esrch。信號量信號量本質(zhì)上是一個非負(fù)的整數(shù)計數(shù)器,它被用來控制對公共資源的訪問。當(dāng)公共資源增加時,調(diào)用函數(shù)sem_post()增加信號量。只有當(dāng)信號量值大于時,才能使用公共資源,使用后,函數(shù)sem_wait()減少信號量。函數(shù)sem_trywait()和函數(shù)pthread_ mutex_trylock()起同樣的作用,它是函數(shù)sem_wait()的非阻塞版本。它們都在頭文件 /usr/include/semaphore.h中定義。信號量的數(shù)據(jù)類型為結(jié)構(gòu)sem_t,它本質(zhì)上是一個
12、長整型的數(shù)。函數(shù)sem_init()用來初始化一個信號量。它的原型為:extern int sem_init _p (sem_t *_sem, int _pshared, unsigned int _value);sem為指向信號量結(jié)構(gòu)的一個指針;pshared不為時此信號量在進(jìn)程間共享,否則只能為當(dāng)前進(jìn)程的所有線程共享;value給出了信號量的初始值。函數(shù)sem_post( sem_t *sem )用來增加信號量的值。當(dāng)有線程阻塞在這個信號量上時,調(diào)用這個函數(shù)會使其中的一個線程不在阻塞,選擇機制同樣是由線程的調(diào)度策略決定的。函數(shù)sem_wait( sem_t *sem )被用來阻塞當(dāng)前線程直
13、到信號量sem的值大于0,解除阻塞后將sem的值減一,表明公共資源經(jīng)使用后減少。函數(shù)sem_trywait ( sem_t *sem )是函數(shù)sem_wait()的非阻塞版本,它直接將信號量sem的值減一。函數(shù)sem_destroy(sem_t *sem)用來釋放信號量sem。3.3流程圖設(shè)置生產(chǎn)者消費者信息創(chuàng)建生產(chǎn)者生產(chǎn)者生產(chǎn)緩存區(qū)空?緩存區(qū)可進(jìn)?創(chuàng)建生產(chǎn)者生產(chǎn)者生產(chǎn)緩存區(qū)空?緩存區(qū)可進(jìn)?程序結(jié)束失敗否否否失敗否4.源程序清單 #include #include #include #include #include #include #include #define max_buffer 2
14、0int in=0,out=0;int pnum,cnum;int sheng=1;int xiao=1;int i;char buffermax_buffer;struct sem_info pthread_t semid; char * name; *psemmax_buffer,*csemmax_buffer;sem_t mutex,full,empty;/生產(chǎn)者開始void produce(struct sem_info * rpsem) printf(第%d個生產(chǎn)者創(chuàng)建完成!.n,sheng+);while(1) int s1; sleep(gettime(); sem_wait(&
15、empty); sem_wait(&mutex); if(in19) in=0; srand(unsigned)time(null)+in); bufferin=rand()%100+10; printf(i am the produce ,the pid:%d ,my name is:%s ,my products is:%dn,&rpsem-semid,&rpsem-name,bufferin); printf(the in point is:%dn,in); printf(the contents of the buffer is:n); for(s1=0;s119) out=0; pr
16、intf(i am the consumer ,the pid:%d ,my name is:%s ,i will consume the products:%dn,&rcsem-semid,&rcsem-name,bufferout); bufferout=0; printf(the out point is:%dn,out); printf(after consume the buffercontents is:n); for(s2=0;s2max_buffer;s2+) printf(%d|,buffers2); out+; printf(n-消費結(jié)束-nn); sem_post(&mu
17、tex); sem_post(&empty); void setproduce() printf(請輸入生產(chǎn)者的個數(shù):); pnum=myscanf(); for(i=0;isemid=0; printf(請輸入第%d個生產(chǎn)者的名字:,i+1); scanf(%s,&psemi-name); getchar(); void setconsumer() printf(請輸入消費者的個數(shù):); cnum=myscanf(); for(i=0;isemid=0; printf(請輸入第%d個消費者的名字:,i+1); scanf(%s,&csemi-name); getchar(); int act
18、ivepthread(int number) int k1=0; int ret1; for(k1=0;k1semid,0,sizeof(psemk1-semid); ret1=pthread_create(&psemk1-semid,null,(void *)produce,psemk1); if(ret1!=0) printf(創(chuàng)建第%d個生產(chǎn)者線程失敗!,k1+1); return -1; return 0;int activecthread(int number) int k2=0; int ret2; for(k2=0;k2semid,0,sizeof(csemk2-semid);
19、ret2=pthread_create(&csemk2-semid,null,(void *)consumer,csemk2); if(ret2!=0) printf(創(chuàng)建第%d個消費者線程失敗!,k2+1); return -1; return 0;int gettime() int j; srand(unsigned)time(null); j=rand()%4+1; return j; int myscanf() int num=-99999; while(1) scanf(%d,&num); getchar(); if(num=20) printf(請輸入1到20的一個整數(shù): ); e
20、lse break; return num;int main() int key1,key2; sem_init(&mutex,0,1); sem_init(&full,0,0); sem_init(&empty,0,max_buffer); setproduce(); setconsumer(); key1=activecthread(cnum); key2=activepthread(pnum); if(key1=0&key2=0) pthread_join(psem0-semid,null);/等待第一個生產(chǎn)者線程的結(jié)束,也就是讓主線程處于無限等待中,不會過早的退出 5. 編譯及運行結(jié)果
21、編譯命令:gcc -o pvpv.c -pthread執(zhí)行命令:./pv運行結(jié)果:rootlocalhost root# gcc pv.c -o pv -pthreadrootlocalhost root# ./pv請輸入生產(chǎn)者的個數(shù):3請輸入第1個生產(chǎn)者的名字:a請輸入第2個生產(chǎn)者的名字:b請輸入第3個生產(chǎn)者的名字:c請輸入消費者的個數(shù):2請輸入第1個消費者的名字:s1請輸入第2個消費者的名字:s2第1個消費者創(chuàng)建完成!.第2個消費者創(chuàng)建完成!.第1個生產(chǎn)者創(chuàng)建完成!.第2個生產(chǎn)者創(chuàng)建完成!.第3個生產(chǎn)者創(chuàng)建完成!.i am the produce ,the pid:134517488 ,m
22、y name is:a ,my products is:70the in point is:0the contents of the buffer is:70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:88the in point is:1the contents of the buffer is:70|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the pr
23、oduce ,the pid:134517520 ,my name is:c ,my products is:93the in point is:2the contents of the buffer is:70|88|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:70the out point is:0after consume the buffercontents is:0|88|93|0
24、|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-消費結(jié)束- i am the consumer ,the pid:134517552 ,my name is:s2 ,i will consume the products:88the out point is:1after consume the buffercontents is:0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-消費結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:46the in
25、point is:3the contents of the buffer is:0|0|93|46|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:70the in point is:4the contents of the buffer is:0|0|93|46|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name i
26、s:c ,my products is:50the in point is:5the contents of the buffer is:0|0|93|46|70|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:93the out point is:2after consume the buffercontents is:0|0|0|46|70|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
27、-消費結(jié)束- i am the consumer ,the pid:134517552 ,my name is:s2 ,i will consume the products:46the out point is:3after consume the buffercontents is:0|0|0|0|70|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|-消費結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:46the in point is:6the contents of the bu
28、ffer is:0|0|0|0|70|50|46|0|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:37the in point is:7the contents of the buffer is:0|0|0|0|70|50|46|37|0|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name is:c ,my products is:81the in p
29、oint is:8the contents of the buffer is:0|0|0|0|70|50|46|37|81|0|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:70the out point is:4after consume the buffercontents is:0|0|0|0|0|50|46|37|81|0|0|0|0|0|0|0|0|0|0|0|-消費結(jié)束- i am the consumer ,th
30、e pid:134517552 ,my name is:s2 ,i will consume the products:50the out point is:5after consume the buffercontents is:0|0|0|0|0|0|46|37|81|0|0|0|0|0|0|0|0|0|0|0|-消費結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:69the in point is:9the contents of the buffer is:0|0|0|0|0|0|46|37|8
31、1|69|0|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:89the in point is:10the contents of the buffer is:0|0|0|0|0|0|46|37|81|69|89|0|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name is:c ,my products is:67the in point is:11the contents o
32、f the buffer is:0|0|0|0|0|0|46|37|81|69|89|67|0|0|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:46the out point is:6after consume the buffercontents is:0|0|0|0|0|0|0|37|81|69|89|67|0|0|0|0|0|0|0|0|-消費結(jié)束- i am the consumer ,the pid:134517552 ,my n
33、ame is:s2 ,i will consume the products:37the out point is:7after consume the buffercontents is:0|0|0|0|0|0|0|0|81|69|89|67|0|0|0|0|0|0|0|0|-消費結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:37the in point is:12the contents of the buffer is:0|0|0|0|0|0|0|0|81|69|89|67|37|0|0|0|0
34、|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:21the in point is:13the contents of the buffer is:0|0|0|0|0|0|0|0|81|69|89|67|37|21|0|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name is:c ,my products is:102the in point is:14the contents of the buffer is:
35、0|0|0|0|0|0|0|0|81|69|89|67|37|21|102|0|0|0|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:81the out point is:8after consume the buffercontents is:0|0|0|0|0|0|0|0|0|69|89|67|37|21|102|0|0|0|0|0|-消費結(jié)束- i am the consumer ,the pid:134517552 ,my name is:s2 ,i
36、 will consume the products:69the out point is:9after consume the buffercontents is:0|0|0|0|0|0|0|0|0|0|89|67|37|21|102|0|0|0|0|0|-消費結(jié)束- i am the produce ,the pid:134517488 ,my name is:a ,my products is:50the in point is:15the contents of the buffer is:0|0|0|0|0|0|0|0|0|0|89|67|37|21|102|50|0|0|0|0|-
37、生產(chǎn)結(jié)束- i am the produce ,the pid:134517504 ,my name is:b ,my products is:16the in point is:16the contents of the buffer is:0|0|0|0|0|0|0|0|0|0|89|67|37|21|102|50|16|0|0|0|-生產(chǎn)結(jié)束- i am the produce ,the pid:134517520 ,my name is:c ,my products is:40the in point is:17the contents of the buffer is:0|0|0|0
38、|0|0|0|0|0|0|89|67|37|21|102|50|16|40|0|0|-生產(chǎn)結(jié)束- i am the consumer ,the pid:134517536 ,my name is:s1 ,i will consume the products:89the out point is:10after consume the buffercontents is:0|0|0|0|0|0|0|0|0|0|0|67|37|21|102|50|16|40|0|0|-消費結(jié)束- i am the consumer ,the pid:134517552 ,my name is:s2 ,i will consume the products:67the out point is:11after consume the buffercontents is:0|0|0|0|0|0|0|0|0|0|0|0|37|21|102|50|16|40|0|0|-消費結(jié)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 無人機操控與航拍技術(shù)考核試卷
- 圖書館數(shù)字資源長期保存策略考核試卷
- 家電產(chǎn)品品質(zhì)監(jiān)控與質(zhì)量改進(jìn)考核試卷
- 整年運輸合同范本
- 大板委托加工合同范本
- 修剪綠化直營合同范本
- 工地個人水電合同范本
- 小學(xué)生美術(shù)課件制作教學(xué)
- 名片合同范本
- 財務(wù)支出季度計劃工作的分解與執(zhí)行要點
- GB/T 18601-2009天然花崗石建筑板材
- 畢業(yè)設(shè)計論文-貝類脫殼機設(shè)計
- 八項規(guī)定學(xué)習(xí)課件
- 《工程電磁場》配套教學(xué)課件
- 《過零丁洋》公開課件
- 從生產(chǎn)工藝角度詳解磷酸鐵鋰
- 全套橋梁施工技術(shù)交底記錄
- 《教師職業(yè)道德》全書word版
- 城市定制型商業(yè)醫(yī)療保險(惠民保)知識圖譜
- GB∕T 3836.31-2021 爆炸性環(huán)境 第31部分:由防粉塵點燃外殼“t”保護(hù)的設(shè)備
- AMDAR資料的分析和應(yīng)用
評論
0/150
提交評論