(完整版)11_linux線程專題講座王保明_第1頁
(完整版)11_linux線程專題講座王保明_第2頁
(完整版)11_linux線程專題講座王保明_第3頁
(完整版)11_linux線程專題講座王保明_第4頁
(完整版)11_linux線程專題講座王保明_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、輕松入門實(shí)戰(zhàn)應(yīng)用從項(xiàng)目開發(fā)角度為你搭建完整的知識(shí)體系wangbaominglinux線程-應(yīng)用編程-專題講座written by 王保明線程概念1線程概念什么是線程在一個(gè)程序里的一個(gè)執(zhí)行路線就叫做線程( thread)。更準(zhǔn)確的定義是:線程是個(gè)進(jìn)程內(nèi)部的控制序列”一切進(jìn)程至少都有一個(gè)執(zhí)行線程進(jìn)程與線程進(jìn)程是資源競(jìng)爭(zhēng)的基本單位線程是程序執(zhí)行的最小單位線程共享進(jìn)程數(shù)據(jù),但也擁有自己的一部分?jǐn)?shù)據(jù)線程ID程序計(jì)數(shù)器寄存器組棧errno一個(gè)進(jìn)程內(nèi)部的線程可以共享資源代碼段數(shù)據(jù)段打開文件和信號(hào)Traditional UNIX Pfoodss StructureProcess IDUlO GID EUID

2、EGlD CWD.Fnle D*scriptoracode data filesregistersstckthreadsc?threadsi ng le-threaded processm ultHh readed processfork和創(chuàng)建新線程的區(qū)別當(dāng)一個(gè)進(jìn)程執(zhí)行一個(gè) fork調(diào)用的時(shí)候,會(huì)創(chuàng)建出進(jìn)程的一個(gè)新拷貝,新進(jìn)程將擁有 它自己的變量和它自己的 PID。這個(gè)新進(jìn)程的運(yùn)行時(shí)間是獨(dú)立的,它在執(zhí)行時(shí)幾乎 完全獨(dú)立于創(chuàng)建它的進(jìn)程在進(jìn)程里面創(chuàng)建一個(gè)新線程的時(shí)候,新的執(zhí)行線程會(huì)擁有自己的堆棧(因此也就有 自己的局部變量),但要與它的創(chuàng)建者共享全局變量、文件描述符、信號(hào)處理器和當(dāng)前的工作目錄狀態(tài)

3、線程的優(yōu)點(diǎn)創(chuàng)建一個(gè)新線程的代價(jià)要比創(chuàng)建一個(gè)新進(jìn)程小得多與進(jìn)程之間的切換相比,線程之間的切換需要操作系統(tǒng)做的工作要少很多線程占用的資源要比進(jìn)程少很多能充分利用多處理器的可并行數(shù)量在等待慢速I/O操作結(jié)束的同時(shí),程序可執(zhí)行其他的計(jì)算任務(wù)計(jì)算密集型應(yīng)用,為了能在多處理器系統(tǒng)上運(yùn)行,將計(jì)算分解到多個(gè)線程中實(shí)現(xiàn)I/O密集型應(yīng)用,為了提高性能,將I/O操作重疊。線程可以同時(shí)等待不同的I/O操作。線程缺點(diǎn)性能損失一個(gè)很少被外部事件阻塞的計(jì)算密集型線程往往無法與共它線程共享同一個(gè)處理器。如果計(jì)算密集型線程的數(shù)量比可用的處理器多,那么可能會(huì)有較大的性能損失,這里的性能損失指的是增加了額外的同步和調(diào)度開銷,而可用

4、的資源不變。健壯性降低編寫多線程需要更全面更深入的考慮,在一個(gè)多線程程序里,因時(shí)間分配上的細(xì)微偏差或者因共享了不該共享的變量而造成不良影響的可能性是很大 的,換句話說線程之間是缺乏保護(hù)的。缺乏訪問控制進(jìn)程是訪問控制的基本粒度,在一個(gè)線程中調(diào)用某些OS函數(shù)會(huì)對(duì)整個(gè)進(jìn)程造成影響。編程難度提高編寫與調(diào)試一個(gè)多線程程序比單線程程序困難得多線程調(diào)度競(jìng)爭(zhēng)范圍操作系統(tǒng)提供了各種模型,用來調(diào)度應(yīng)用程序創(chuàng)建的線程。這些模型之間的主要不同是:在競(jìng)爭(zhēng)系統(tǒng)資源(特別是CPU時(shí)間)時(shí),線程調(diào)度競(jìng)爭(zhēng)范圍(thread-scheduling contention scope )不一樣進(jìn)程競(jìng)爭(zhēng)范圍(process conte

5、ntion scope ):各個(gè)線程在同一進(jìn)程競(jìng)爭(zhēng)被調(diào)度的 CPU時(shí)間”(但不直接和其他進(jìn)程中的線程競(jìng)爭(zhēng))。系統(tǒng)競(jìng)爭(zhēng)范圍(system contention scope ):線程直接和“系統(tǒng)范圍”內(nèi)的其他線程競(jìng) 爭(zhēng)。2線程模型N:1用戶線程模型線程實(shí)現(xiàn)”建立在進(jìn)程控制”機(jī)制之上,由用戶空間的程序庫來管理。OS內(nèi)核完全不知道線程信息。這些線程稱為用戶空間線程。這些線程都工作在“進(jìn)程競(jìng)爭(zhēng)范圍”N:1 USER THREADING MODELN:1用戶線程模型在N:1線程模型中,內(nèi)核不干涉線程的任何生命活動(dòng),也不干涉同一進(jìn)程中的線程 環(huán)境切換。在N:1線程模型中,一個(gè)進(jìn)程中的多個(gè)線程只能調(diào)度到一個(gè)C

6、PU,這種約束限制了可用的并行總量。第二個(gè)缺點(diǎn)是如果某個(gè)線程執(zhí)行了一個(gè)“阻塞式”操作(如 read),那么,進(jìn)程中的所有線 程都會(huì)阻塞,直至那個(gè)操作結(jié)束。為此,一些線程的實(shí)現(xiàn)是為這些阻塞式函數(shù)提供包裝器, 用非阻塞版本替換這些系統(tǒng)調(diào)用,以消除這種限制。1:1核心線程模型在1:1核心線程模型中,應(yīng)用程序創(chuàng)建的每一個(gè)線程都由一個(gè)核心線程直接管理。OS內(nèi)核將每一個(gè)核心線程都調(diào)到系統(tǒng)CPU上,因此,所有線程都工作在 “系統(tǒng)競(jìng)爭(zhēng)范圍”。這種線程的創(chuàng)建與調(diào)度由內(nèi)核完成,因?yàn)檫@種線程的系統(tǒng)開銷比較大(但一般來說,比進(jìn)程開銷小)PROCFSSFSSER*THREADSI I KERNEL TILREDJNG

7、MUDELN:M混合線程模型N:M混合線程模型提供了兩級(jí)控制,將用戶線程映射為系統(tǒng)的可調(diào)度體以實(shí)現(xiàn)并行,這個(gè)可調(diào)度體稱為輕量級(jí)進(jìn)程(LWP:lightweight process), LWP再一一映射到核心線程TweJUHKEHCL- THRtAWN M翹方博用梅舉Iraditiofial UNI1X Process StruduireSolar s 2 Process StructureF-cess IDUt后七曲市二W;、口二電二巡DUIDGilD EUiDEGIDGWD.總結(jié):(1)用戶級(jí)線程用戶級(jí)線程主要解決的是上下文切換的問題,它的調(diào)度算法和調(diào)度過程全部由用戶自行選擇決定,在運(yùn)行時(shí)不

8、需要特定的內(nèi)核支持。在這里,操作系統(tǒng)往往會(huì)提供一個(gè)用戶空間的線程庫,該線程庫提供了線程的創(chuàng)建、調(diào)度和撤銷等功能,而內(nèi)核仍然僅對(duì)進(jìn)程進(jìn)行管理。 如果一個(gè)進(jìn)程中的某一個(gè)線程調(diào)用了一個(gè)阻塞的系統(tǒng)調(diào)用函數(shù),那么該進(jìn)程包括該進(jìn)程中的其他所有線程也同時(shí)被阻塞。這種用戶級(jí)線程的主要缺點(diǎn)是在一個(gè)進(jìn)程中的多個(gè)線程的調(diào)度 中無法發(fā)揮多處理器的優(yōu)勢(shì)。(2)輕量級(jí)進(jìn)程輕量級(jí)進(jìn)程是內(nèi)核支持的用戶線程,是內(nèi)核線程的一種抽象對(duì)象。每個(gè)線程擁有一個(gè)或多個(gè)輕量級(jí)線程,而每個(gè)輕量級(jí)線程分別被綁定在一個(gè)內(nèi)核線程上。(3)內(nèi)核線程這種線程允許不同進(jìn)程中的線程按照同一相對(duì)優(yōu)先調(diào)度方法進(jìn)行調(diào)度,這樣就可以發(fā)揮多處理器的并發(fā)優(yōu)勢(shì)。現(xiàn)在大多

9、數(shù)系統(tǒng)都采用用戶級(jí)線程與核心級(jí)線程并存的方法。一個(gè)用戶級(jí)線程可以對(duì)應(yīng)一個(gè)或幾個(gè)核心級(jí)線程,也就是 工對(duì)一 ”或 多對(duì)一 ”模型。這樣既可滿足多處理機(jī)系統(tǒng)的需要, 也可以最大限度地減少調(diào)度開銷。使用線程機(jī)制大大加快上下文切換速度而且節(jié)省很多資源。但是因?yàn)樵谟脩魬B(tài)和內(nèi)核態(tài)均要實(shí)現(xiàn)調(diào)度管理,所以會(huì)增加實(shí)現(xiàn)的復(fù)雜度和引起優(yōu)先級(jí)翻轉(zhuǎn)的可能性。一個(gè)多線程程序的同步設(shè)計(jì)與調(diào)試也會(huì)增加程序?qū)崿F(xiàn)的難度2線程API線程基本posix apiPOSIX線程庫與線程有關(guān)的函數(shù)構(gòu)成了一個(gè)完整的系列,絕大多數(shù)函數(shù)的名字都是以“ pthread_打頭的要使用這些函數(shù)庫,要通過引入頭文鏈接這些線程函數(shù)庫時(shí)要使用編譯器命令的

10、-Ipthread”選項(xiàng)pthread_create 函數(shù)功能:創(chuàng)建一個(gè)新的線程原型int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void*(*start_routine)(void*), void *arg);參數(shù)thread:返回線程IDattr:設(shè)置線程的屬性,attr為NULL表示使用默認(rèn)屬性start_routine:是個(gè)函數(shù)地址,線程啟動(dòng)后要執(zhí)行的函數(shù)arg:傳給線程啟動(dòng)函數(shù)的參數(shù)返回值:成功返回 0;失敗返回錯(cuò)誤碼錯(cuò)誤檢查傳統(tǒng)的一些函數(shù)是,成功返回0,失敗返回-1,并且對(duì)全局變量 errno賦值

11、以指示錯(cuò)誤。pthreads函數(shù)出錯(cuò)時(shí)不會(huì)設(shè)置全局變量errno (而大部分其他 POSIX函數(shù)會(huì)這樣做)而是將錯(cuò)誤代碼通過返回值返回pthreads同樣也提供了線程內(nèi)的errno變量,以支持其它使用errno的代碼。對(duì)于pthreads函數(shù)的錯(cuò)誤,建議通過返回值業(yè)判定,因?yàn)樽x取返回值要比讀取線程內(nèi)的errno變量的開銷更小pthread_exit 函數(shù)功能:線程終止原型void pthread_exit(void *value_ptr);參數(shù)value_ptr:value_ptr不要指向一個(gè)局部變量。返回值:無返回值,跟進(jìn)程一樣,線程結(jié)束的時(shí)候無法返回到它的調(diào)用者(自身) pthread_j

12、oin 函數(shù)功能:等待線程結(jié)束原型int pthread_join(pthread_t thread, void *value_ptr);參數(shù)thread:線程 IDvalue_ptr:它指向一個(gè)指針,后者指向線程的返回值返回值:成功返回0;失敗返回錯(cuò)誤碼pthread_self 函數(shù)功能:返回線程ID原型pthread_t pthread_self(void);返回值:成功返回0pthread_cancel 函數(shù)功能:取消一個(gè)執(zhí)行中的線程原型int pthread_cancel(pthread_t thread);參數(shù)thread:線程 ID返回值:成功返回0;失敗返回錯(cuò)誤碼pthread_

13、detach 函數(shù)功能:將一個(gè)線程分離(短暫的,后臺(tái)處理)原型int thread);參數(shù)thread:線程 ID返回值:成功返回0;失敗返回錯(cuò)誤碼線程客戶端測(cè)試框架多線程服務(wù)器框架3線程屬性線程屬性初始化與銷毀屬性int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);獲取與設(shè)置分離屬性int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);int pthread_at

14、tr_setdetachstate(pthread_attr_t *attr, int detachstate);獲取與設(shè)置棧大小int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);獲取與設(shè)置棧溢出保護(hù)區(qū)大小int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);int pthread

15、_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);獲取與設(shè)置線程競(jìng)爭(zhēng)范圍int pthread_attr_getscope(const pthread_attr_t *attr,int *contentionscope);int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope);獲取與設(shè)置調(diào)度策略int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);int

16、 pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);獲取與設(shè)置繼承的調(diào)度策略int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);獲取與設(shè)置調(diào)度參數(shù)int pthread_attr_getschedparam(const pthread_attr_t *attr, stru

17、ct sched_param*param);int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);并發(fā)級(jí)別獲取與設(shè)置并發(fā)級(jí)別int pthread_setconcurrency(int new_level);int pthread_getconcurrency(void);僅在N:M線程模型中有效,設(shè)置并發(fā)級(jí)別,給內(nèi)核一個(gè)提提示:表示提供給定級(jí)別數(shù)量的核心線程來映射用戶線程是高效的。其他說明?綁定屬性Linux中采用 對(duì)一 ”的線程機(jī)制,也就是一個(gè)用戶線程對(duì)應(yīng)一個(gè)內(nèi)核線程。綁定

18、屬性 就是指一個(gè)用戶線程固定地分配給一個(gè)內(nèi)核線程,因?yàn)镃PU時(shí)間片的調(diào)度是面向內(nèi)核線程(也就是輕量級(jí)進(jìn)程)的,因此具有綁定屬性的線程可以保證在需要的時(shí)候總有一個(gè)內(nèi)核線程與之對(duì)應(yīng)。而與之對(duì)應(yīng)的非綁定屬性就是指用戶線程和內(nèi)核線程的關(guān)系不是始終固定的, 而是由系統(tǒng)來控制分配的。?分離屬性分離屬性是用來決定一個(gè)線程以什么樣的方式來終止自己。在非分離情況下,當(dāng)一個(gè)線程結(jié)束時(shí),它所占用的系統(tǒng)資源并沒有被釋放,也就是沒有真正的終止。只有當(dāng)pthread_join()函數(shù)返回時(shí),創(chuàng)建的線程才能釋放自己占用的系統(tǒng)資源。而在分離屬性情況下, 一個(gè)線程結(jié)束時(shí)立即釋放它所占有的系統(tǒng)資源。這里要注意的一點(diǎn)是,如果設(shè)置一

19、個(gè)線程的分離屬性, 而這個(gè)線程運(yùn)行又非常快,那么它很可能在pthread_create()函數(shù)返回之前就終止了,它終止以后就可能將線程號(hào)和系統(tǒng)資源移交給其他的線程使用。4線程互斥和同步基本概念多線程同步問題:線程共享進(jìn)程的資源和地址空間任何線程對(duì)系統(tǒng)資源的操作都會(huì)給其他線程帶來影響 多線程同步方法:互斥鎖信號(hào)量條件變量posix互斥鎖posix互斥鎖? 互斥鎖是用一種簡(jiǎn)單的加鎖方法來控制對(duì)共享資源的原子操作。這個(gè)互斥鎖只有兩 種狀態(tài),也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全局變量。在同一時(shí) 刻只能有一個(gè)線程掌握某個(gè)互斥鎖,擁有上鎖狀態(tài)的線程能夠?qū)蚕碣Y源進(jìn)行操作。若其他線程希望上鎖一個(gè)

20、已經(jīng)被上鎖的互斥鎖,則該線程就會(huì)掛起,直到上鎖的線 程釋放掉互斥鎖為止。可以說,這把互斥鎖保證讓每個(gè)線程對(duì)共享資源按順序進(jìn)行 原子操作。posix互斥鎖api?互斥鎖機(jī)制主要包括下面的基本函數(shù)。?互斥鎖初始化:pthread mutex init()?互斥鎖上鎖:pthread_mutex_lock()?互斥鎖判斷上鎖:pthread_mutex_trylock()?互斥鎖接鎖:pthread_mutex_unlock()?消除互斥鎖:pthread_mutex_destroy()? 其中,互斥鎖可以分為快速互斥鎖、遞歸互斥鎖和檢錯(cuò)互斥鎖。這三種鎖的區(qū)別主 要在于其他未占有互斥鎖的線程在希望得

21、到互斥鎖時(shí)是否需要阻塞等待。快速鎖是 指調(diào)用線程會(huì)阻塞直至擁有互斥鎖的線程解鎖為止。遞歸互斥鎖能夠成功地返回, 并且增加調(diào)用線程在互斥上加鎖的次數(shù),而檢錯(cuò)互斥鎖則為快速互斥鎖的非阻塞版 本,它會(huì)立即返回并返回一個(gè)錯(cuò)誤信息。默認(rèn)屬性為快速互斥鎖。該函數(shù)用于C函數(shù)的多線程編程中,互斥鎖的初始化。頭文件:#include 函數(shù)原型:int pthread_mutex_init(pthread_mutex_t restrict mutex,const pthread_mutexattr_t restrict attr);pthread_mutex_t mutex = PTHREAD_MUTEX_INI

22、TIALIZER;pthread_mutex_init()函數(shù)是以動(dòng)態(tài)方式創(chuàng)建互斥鎖的,參數(shù) attr指定了新建互斥鎖的屬性。如果參數(shù)attr為空,則使用默認(rèn)的互斥鎖屬性,默認(rèn)屬性為快速互斥鎖。互斥鎖的屬性在創(chuàng)建鎖的時(shí)候指定,在LinuxThreads實(shí)現(xiàn)中僅有一個(gè)鎖類型屬性,不同的鎖類型在試圖對(duì)一 個(gè)已經(jīng)被鎖定的互斥鎖加鎖時(shí)表現(xiàn)不同。pthread_mutexattr_init()函數(shù)成功完成之后會(huì)返回零,其他任何返回值都表示出現(xiàn)了錯(cuò)誤。函數(shù)成功執(zhí)行后,互斥鎖被初始化為未鎖住態(tài)。互斥鎖屬性使用互斥鎖(互斥)可以使線程按順序執(zhí)行。通常,互斥鎖通過確保一次只有一個(gè)線程執(zhí)行 代碼的臨界段來同步多個(gè)

23、線程。互斥鎖還可以保護(hù)單線程代碼。要更改缺省的互斥鎖屬性,可以對(duì)屬性對(duì)象進(jìn)行聲明和初始化。通常,互斥鎖屬性會(huì)設(shè)置在應(yīng)用程序開頭的某個(gè)位置,以便可以快速查找和輕松修改銷毀互斥鎖對(duì)象pthread_mutexattr_destroy(3C)可用來取消分配用于維護(hù)pthread_mutexattr_init()所創(chuàng)建的屬性對(duì)象的存儲(chǔ)空間。pthread_mutexattr_destroy 語法int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr)#include pthread_mutexattr_t mattr;int ret;/* de

24、stroy an attribute */ret = pthread_mutexattr_destroy(&mattr);pthread_mutexattr_destroy 返回值pthread_mutexattr_destroy() 成功完成之后會(huì)返回零。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。如果出現(xiàn)以下情況,該函數(shù)將失敗并返回對(duì)應(yīng)的值。EINVAL描述:由 mattr 指定的值無效。posix條件變量基本概念? 與互斥鎖不同,條件變量是用來等待而不是用來上鎖的。條件變量用來自動(dòng)阻塞一個(gè)線程,直到某特殊情況發(fā)生為止。通常條件變量和互斥鎖同時(shí)使用。? 條件變量使我們可以睡眠等待某種條件出現(xiàn)。條件變量

25、是利用線程間共享的全局變量進(jìn)行同步的一種機(jī)制,主要包括兩個(gè)動(dòng)作:一個(gè)線程等待 條件變量的條件成立 而掛起;另一個(gè)線程使條件成立(給出條件成立信號(hào))? 條 件的檢測(cè)是在互斥鎖的保護(hù)下進(jìn)行的。如果一個(gè)條件為假,一個(gè)線程自動(dòng)阻塞, 并釋放等待狀態(tài)改變的互斥鎖。如果另一個(gè)線程改變了條件,它發(fā)信號(hào)給關(guān)聯(lián)的條 件 變量,喚醒一個(gè)或多個(gè)等待它的線程,重新獲得互斥鎖,重新評(píng)價(jià)條件。如果兩 進(jìn)程共享可讀寫的內(nèi)存,條件變量可以被用來實(shí)現(xiàn)這兩進(jìn)程間的線程同步。? api列表? pthread_cond_init? pthread_cond_destroy? pthread_cond_wait? pthread_co

26、nd_signal? pthread_cond_broadcast條件變量使用規(guī)范等待條件代碼pthread_mutex_lock(&mutex);while (條件為假) pthread_cond_wait(cond, mutex);修改條件pthread_mutex_unlock(&mutex);給條件發(fā)送信號(hào)代碼pthread_mutex_lock(&mutex);設(shè)置條件為真pthread_cond_signal(cond);pthread_mutex_unlock(&mutex);?使用條件變量之前要先進(jìn)行初始化。可以在單個(gè)語句中生成和初始化一個(gè)條件變量如:? pthread_con

27、d_t my_condition=PTHREAD_COND_INITIALIZER;(用于進(jìn)程間線程的通 信)。也可以利用函數(shù) pthread_cond_init動(dòng)態(tài)初始化名禰:ptihrezd r and iruf目標(biāo)1條件變量初始化女文件1lude 弋 phe占函數(shù)胞形;丑而2與nd. const pttreaondattr_r *#上然-西希件衣量Htl條件變量屬性展劫返回0.里誼叵落工編號(hào)q返回面pthread_cond_destroy函數(shù)可以用來摧毀所指定的條件變量,同時(shí)將會(huì)釋放所給它分配的資源。調(diào)用該函數(shù)的進(jìn)程也并不要求等待在參數(shù)所指定的條件變量上。jpthread_cond destroy目標(biāo):條件變量推毀頭文件:#incrjde 函數(shù)算形;mt pthrad_c?oiid destroypthread+cond)?致cptr親沖受員返回咱f成功返回Q,出帽逅回錯(cuò)誤旗號(hào).名稱:pthread _c nd_woit/othr? ad

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論