1. 程式人生 > >UDP、線程、mutex鎖(day15)

UDP、線程、mutex鎖(day15)

col size_t tpi 信號量 使用 網絡編程 改變 ket 條件

一、基於UDP的網絡編程模型
服務器端
1、創建socket.
2、將fd和服務器的ip地址和端口號綁定
3、recvfrom阻塞等待接收客戶端數據
4、業務處理
5、響應客戶端


客戶端:
1、創建socket
2、向服務器發送數據sendto
3、阻塞等待服務器的響應信息
4、處理響應信息
5、斷開通訊

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd,void *buf,size_t len,    int flags,
        struct sockaddr *src_addr,     socklen_t 
*addrlen); 功能:從一個socket上接收消息 參數: sockfd:指定socket。socket(2)的返回值 buf:存放消息的緩沖區地址 len:指定buf的最大尺寸 flags:0 src_addr:存放的是對面的地址 addrlen:是一個值-結果參數。src_addr的長度 返回值: 成功 返回接收到的字節數 -1 錯誤 errno被設置 0 對面down機 #include <sys/types.h> #include <sys/socket.h> ssize_t sendto(int sockfd, const void *buf, size_t len, int
flags, const struct sockaddr *dest_addr, socklen_t addrlen); 功能:在socket上發送消息 參數: sockfd:指定socket buf:存放數據的緩沖區首地址 len:buf中有效的字節數 flags:0 dest_addr:目標地址 addrlen:目標地址的長度 返回值: -1 錯誤 errno被設置 成功 返回發送出去的字節數。 編寫代碼實現基於udp的網絡通訊。 代碼參見: userv.c uclie.c 172.30.3.93 網絡通訊 二、線程的基礎 線程 執行的基本單位,線程共享進程的資源 進程 進程是資源分配的基本單位 每個線程有自己的tid。thread_id 每個線程有自己私有的棧幀。 三、線程的創建 系統提供了函數pthread_create(
3)用於創建線程 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能:創建一個新的線程 參數: thread:存放線程id的緩沖區。 attr:NULL 缺省屬性 start_routine:線程的執行函數 arg:start_routine函數的唯一參數。 返回值: 0 成功 錯誤 錯誤碼 Compile and link with -pthread. void *(*start_routine) (void *) 舉例說明 創建新的線程 代碼參見 pthread_c.c getpid(2)獲取進程的pid。 pthread_self(3)來獲取線程自己的tid。 #include <pthread.h> pthread_t pthread_self(void); 功能:獲取當前線程的id 參數: void 返回值: 返回線程的id。 四、線程退出、匯合、分離 線程的退出 1、return和exit(3)的區別 return只是函數的返回,在線程處理函數中,只是代表了線程的結束。而exit(3)代表的是進程的結束。進程中的所有線程就終止了。 2、使用函數pthread_exit(3)來終止一個線程 #include <pthread.h> void pthread_exit(void *retval); 功能:終止當前線程 參數: retval:指定傳遞給另一個線程的值,那個線程調用pthread_join(3)接收這個值。 返回值: 不返回給調用者。 3、pthread_cancel(3) #include <pthread.h> int pthread_cancel(pthread_t thread); 功能:給線程發送取消請求 參數: thread:指定了接收請求的線程id。 返回值: 0 成功 非0 錯誤碼 註意:使用pthread_cancel終止的進程,在使用pthread_join(3)獲取線程退出信息的時候,獲取到的是PTHREAD_CANCELED。 線程的匯合 pthread_join(3)等待線程的匯合 #include <pthread.h> int pthread_join(pthread_t thread, void **retval); 功能:匯合一個終止的線程 參數: thread:指定了等待匯合的線程的id retval: 返回值: 成功 0 失敗 返回錯誤碼 舉例說明 線程的退出和匯合 代碼參見pthread_e.c 線程的分離 pthread_detach(3) #include <pthread.h> int pthread_detach(pthread_t thread); 功能:分離一個線程 參數: thread:指定要分離的線程 返回值: 0 成功 非0 錯誤碼 舉例說明 線程的分離 代碼參見 pthread_d.c 新建的線程和進程中已經存在的線程是異步的。 這些線程會對公共資源形成競爭。怎麽解決競爭? 1、可重入函數 2、讓異步的線程同步的訪問共享資源。 五、線程同步 條件變量 mutex鎖 信號量 舉例說明 多個線程異步訪問共享資源(臨界資源) 代碼參見 count.c 使用mutex鎖解決臨界資源的問題 什麽是mutex鎖? pthread_mutex_t 是一個類型 mutex鎖類型 mutex所是一個互斥設備。 一個mutex鎖類型的變量有兩中狀態 unlocked:不被任何線程擁有 locked:被一個線程擁有 一個mutex鎖從來不能被兩個線程同時擁有。 如果一個線程想擁有的mutex鎖,被另外的線程占用。那麽這個線程掛起執行,直到另外線程放棄才能得到。 對臨界資源的訪問要遵守三歩: 1、先獲取mutex鎖 2、訪問臨界資源 3、釋放mutex鎖 phtread_mutex_init(3) #include <pthread.h> 靜態初始化一個mutex鎖 pthread_mutex_t fastmutex=PTHREAD_MUTEX_INITIALIZER; int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); 功能:初始化一個mutex鎖 參數: mutex:指定要初始化的mutex鎖 mutexattr:NULL 默認 返回值: 0 int pthread_mutex_lock(pthread_mutex_t *mutex); 功能:獲取mutex鎖,如果這個鎖不被其他線程占有,立即返回,擁有了這把鎖。將鎖的狀態改變為locked。 這把鎖被其他線程占有。掛起線程,直到其他線程解鎖為止。 參數: mutex:指定了要獲取的mutex鎖 返回值: 非0 錯誤 0 成功 int pthread_mutex_trylock(pthread_mutex_t *mutex); 功能:獲取mutex鎖,在其他線程占有這個mutex鎖的時候,非阻塞。立即返回,錯誤。EBUSY 參數: mutex:指定要獲取的mutex鎖 返回值: 非0 錯誤 0 成功 int pthread_mutex_unlock(pthread_mutex_t *mutex); 功能:解鎖mutex 參數: mutex:釋放mutex鎖 返回值: 非0 錯誤 0 成功 int pthread_mutex_destroy(pthread_mutex_t *mutex); 功能:銷毀mutex鎖 參數: mutex:指定要銷毀的mutex鎖 返回值: 非0 錯誤 0 成功 改進count.c。使用mutex鎖讓進程同步訪問臨界資源。 總結: 一、基於UDP的編程模型 二、線程的基礎 三、線程的創建 四、線程的退出、匯合、分離 五、線程同步 mutex鎖

UDP、線程、mutex鎖(day15)