freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

嵌入式課程設(shè)計(jì)-文庫吧

2025-06-02 16:11 本頁面


【正文】 是用一種簡(jiǎn)單的加鎖方法來控制對(duì)共享資源的原子操作。這個(gè)互斥鎖只有兩種狀態(tài),也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全局變量。在同一時(shí)刻只能有一個(gè)線程掌握某個(gè)互斥鎖,擁有上鎖狀態(tài)的線程能夠?qū)蚕碣Y源進(jìn)行操作。若其他線程希望上鎖一個(gè)已經(jīng)被上鎖的互斥鎖,則該線程就會(huì)掛起,直到上鎖的線程釋放掉互斥鎖為止。可以說,這把互斥鎖保證讓每個(gè)線程對(duì)共享資源按順序進(jìn)行原子操作?;コ怄i可以分為快速互斥鎖、遞歸互斥鎖和檢錯(cuò)互斥鎖。這三種鎖的區(qū)別主要在于其他未占有互斥鎖的線程在希望得到互斥鎖時(shí)是否需要阻塞等待。快速鎖是指調(diào)用線程會(huì)阻塞直至擁有互斥鎖的線程解鎖為止。遞歸互斥鎖能夠成功地返回,并且增加調(diào)用線程在互斥上加鎖的次數(shù),而檢錯(cuò)互斥鎖則為快速互斥鎖的非阻塞版本,它會(huì)立即返回并返回一個(gè)錯(cuò)誤信息?;コ怄i機(jī)制主要包括下面的基本函數(shù):1) 互斥鎖初始化:pthread_mutex_init()2) 互斥鎖上鎖:pthread_mutex_lock()3) 互斥鎖判斷上鎖:pthread_mutex_trylock()4) 互斥鎖解鎖:pthread_mutex_unlock()5) 消除互斥鎖:pthread_mutex_destroy()2. 信號(hào)量信號(hào)量也就是操作系統(tǒng)中所用到的PV原子操作,它廣泛用于進(jìn)程或線程間的同步與互斥。信號(hào)量本質(zhì)上是一個(gè)非負(fù)的整數(shù)計(jì)數(shù)器,它被用來控制對(duì)公共資源的訪問。PV原子操作是對(duì)整數(shù)計(jì)數(shù)器信號(hào)量sem的操作。一次P操作使sem減一,而一次V操作使sem加一。進(jìn)程(或線程)根據(jù)信號(hào)量的值來判斷是否對(duì)公共資源具有訪問權(quán)限。當(dāng)信號(hào)量sem的值大于等于零時(shí),該進(jìn)程(或線程)具有公共資源的訪問權(quán)限;相反,當(dāng)信號(hào)量sem的值小于零時(shí),該進(jìn)程(或線程)就將阻塞直到信號(hào)量sem的值大于等于0為止。信號(hào)量機(jī)制主要包括下面的基本函數(shù):1) 創(chuàng)建信號(hào)量: sem_init()2) 等待信號(hào)量:sem_wait()和sem_trywait()3) 喚醒進(jìn)程:sem_post()4) 獲取信號(hào)量: sem_getvalue()5) 刪除信號(hào)量: sem_destroy() Socket網(wǎng)絡(luò)編程模型在Linux中的網(wǎng)絡(luò)編程是通過socket接口來進(jìn)行的。socket是一種特殊的I/O接口,它也是一種文件描述符。它是一種常用的進(jìn)程之間通信機(jī)制,通過它不僅能實(shí)現(xiàn)本地機(jī)器上的進(jìn)程之間的通信,而且通過網(wǎng)絡(luò)能夠在不同機(jī)器上的進(jìn)程之間進(jìn)行通信。源IP地址和目的IP地址以及源端口號(hào)和目的端口號(hào)的組合稱為套接字。其用于標(biāo)識(shí)客戶端請(qǐng)求的服務(wù)器和服務(wù),它是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必需的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口。 TCP Server編程模型設(shè)置為監(jiān)聽狀態(tài)進(jìn)行版本協(xié)商創(chuàng)建套接字接受客戶端的連接請(qǐng)求接收或者發(fā)送數(shù)據(jù)關(guān)閉套接字圖 321 Server編程模型1) 進(jìn)行版本協(xié)商(WSAStartup)2) 創(chuàng)建一個(gè)套接字(socket())3) 將套接字設(shè)為監(jiān)聽狀態(tài)(listen())4) 接受客戶端的連接請(qǐng)求(accept())5) 發(fā)送或者接收數(shù)據(jù)(send()/recv())6) 關(guān)閉套接字(close()) TCP Client編程模型連接到服務(wù)器進(jìn)行版本協(xié)商創(chuàng)建套接字接收或者發(fā)送數(shù)據(jù)關(guān)閉套接字圖 322 Client編程模型1) 進(jìn)行版本協(xié)商(WSAStartup)2) 創(chuàng)建一個(gè)套接字(socket())3) 連接到服務(wù)器(connect())4) 發(fā)送或者接收函數(shù)(send()/recv())5) 關(guān)閉套接字(close()) 程序設(shè)計(jì) 主要內(nèi)容設(shè)計(jì)TCP服務(wù)器程序,使用多線程實(shí)現(xiàn)”生產(chǎn)者消費(fèi)者“模型,建立TCP服務(wù)器,響應(yīng)客戶端請(qǐng)求,發(fā)送客戶端指定的請(qǐng)求數(shù)據(jù)。,數(shù)據(jù)包含(學(xué)號(hào),姓名(拼音),年齡,身高,體重,當(dāng)前系統(tǒng)時(shí)間(納秒數(shù))使用gettimeofday),可使用隊(duì)列/多維數(shù)組存儲(chǔ)數(shù)據(jù)。,響應(yīng)多個(gè)客戶端的連接,讀取隊(duì)列/數(shù)組,向客戶端發(fā)送指定“學(xué)號(hào)”的數(shù)據(jù)。設(shè)計(jì)TCP服務(wù)器程序。,連接服務(wù)器并請(qǐng)求指定“學(xué)號(hào)”的數(shù)據(jù),接收數(shù)據(jù)并存儲(chǔ)在文件中。要求存儲(chǔ)有意義的數(shù)據(jù),由于TCP是基于字節(jié)流的特征,需要做組包處理 服務(wù)器端程序設(shè)計(jì)以下是服務(wù)器端程序的主函數(shù)部分,在主函數(shù)中,首先創(chuàng)建了一個(gè)新的線程,然后按照網(wǎng)絡(luò)編程模型中服務(wù)器端的編程方法進(jìn)行了編程,詳細(xì)程序設(shè)計(jì)請(qǐng)參考附件1.void main(void){ /**************子線程相關(guān)*******************/ pthread_t reader = 1。 //read進(jìn)程的進(jìn)程號(hào) pthread_mutex_init(amp。mutex,NULL)。 //初始化 互斥鎖 /*初始化數(shù)據(jù)*/ int i = 0。 for(i=0。 i5。 i++) { information[i].name = NAME[i]。 information[i].age = AGE[i]。 information[i].number = NUM[i]。 information[i].high = HIGH[i]。 information[i].weigh = WIGHT[i]。 } /*創(chuàng)建線程,產(chǎn)生數(shù)據(jù)*/ pthread_create(amp。reader,NULL,(void*)amp。writer_function,NULL)。 /************主線程相關(guān)**********************/ //創(chuàng)建socket nListenSock =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)。 if(nListenSock0) { printf(create listen socket error\n)。 return。 } //設(shè)置socket選項(xiàng) int nValue=1。 if(setsockopt(nListenSock,SOL_SOCKET,SO_REUSEADDR,(char*)amp。nValue,sizeof(int))0) { printf(set option SO_REUSEADDR fail!\n)。 close(nListenSock)。 return。 } //綁定 struct sockaddr_in localAddr。 memset(amp。localAddr,0x0,sizeof(localAddr))。 =AF_INET。 =htonl(INADDR_ANY)。 =htons(10000)。 if(bind(nListenSock,(struct sockaddr*)amp。localAddr,sizeof(struct sockaddr))0) { printf(bind liste sock fail!\n)。 close(nListenSock)。 return。 } //監(jiān)聽 if(listen(nListenSock,5)0) { printf(listen error!\n)。 close(nListenSock)。 return。 } //創(chuàng)建客戶端的線程 int nSrvThreadId =1。 nThreadFlag =1。 if(pthread_create((pthread_t*)amp。nSrvThreadId,NULL,(void*)amp。serverThreadProc,NULL)0) { printf(create server thread fail!\n)。 close(nListenSock)。 return。 } //等待退出 while(1) { if(pthread_join(nSrvThreadId,NULL)!=0) { return。 } }} 客戶端程序設(shè)計(jì)以下是客戶端的程序設(shè)計(jì),代碼片段太過冗長(zhǎng),詳細(xì)的程序設(shè)計(jì)請(qǐng)參考附件2。void main(int argc, char** argv){//創(chuàng)建套接字 int sockfd=1。 sockfd =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)。 if(sockfd0) { printf(socket create error\n)。 return。 } ......//建立連接 while(1) //建立鏈接 { if(connect(sockfd, (struct sockaddr*)amp。serverAddr, sizeof(serverAddr))==0) { printf(connected\n)。 break。 } sleep(1)。 }......//創(chuàng)建交互進(jìn)程 pthread_t ipt_id。 if(pthread_create((pthread_t *)amp。ipt_id,NULL,(void*)amp。input,NULL)0) { printf(create input thread fail!\n)。 close(ipt_id)。 return。 }......}第4章 綜合測(cè)試 功能測(cè)試 ,處于監(jiān)聽狀態(tài),等待客戶端來連接,當(dāng)有客戶端連接上,輸出連接的客戶端的信息。圖 411 服務(wù)器運(yùn)行,等待用戶輸入要從數(shù)據(jù)庫中讀取的信息編號(hào),當(dāng)用戶輸入要讀取的信息標(biāo)號(hào)的時(shí)候,服務(wù)器響應(yīng)客戶端的請(qǐng)求,回復(fù)信息。圖 412 客戶端運(yùn)行,內(nèi)部包含客戶端請(qǐng)求的信息。圖 413 生成文件,內(nèi)部為請(qǐng)求的信息。圖 414 文件內(nèi)容 第5章 結(jié)論本次課程設(shè)計(jì)的內(nèi)容是基于Linux操作系統(tǒng)的多線程網(wǎng)絡(luò)編程,實(shí)現(xiàn)的功能是“生產(chǎn)者”,“消費(fèi)者”模型,建立TCP服務(wù)器,響應(yīng)客戶端請(qǐng)求,并發(fā)送客戶端請(qǐng)求的數(shù)據(jù)。在程序的設(shè)計(jì)過程中采用了多線程的編程方式,顯著提高了程序運(yùn)行的效率。客戶端與服務(wù)器
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1