一、前情回顧
void perror(const char *s); |
功能: |
參數: |
二、資源競爭
1.多線程訪問臨界資源時存在資源競爭(存在資源競爭、造成數據錯亂)
臨界資源:多個線程可以同時操作的資源空間(全局變量、共享內存)
解決:
????????互斥:多個線程訪問臨界資源時,進行排他性訪問。(同一時刻只允許一個線程對該臨界資源進行訪問)
????????互斥鎖:解決多線程訪問臨界資源時,存在資源競爭。
? ? ? ? 1.創建? ? ? ? ? ?pthread_mutex_t mutex
? ? ? ? 2.初始化????????pthread_mutex_init
? ? ? ? 3.加鎖? ? ? ? ? ??int pthread_mutex_lock
? ? ? ? 4.解鎖? ? ? ? ? ??int pthread_mutex_unlock
? ? ? ? 5.銷毀鎖????????int pthread_mutex_destroy
int pthread_mutex_init(pthread_mutex_t *restrict muxt,const pthread_mutexattr_t *restrict attr); |
功能:初始化一個互斥鎖 |
參數: restrict attr:鎖的屬性(NULL) |
返回值: 成功:0 失敗:非零 |
上鎖? ? ? ? ? int pthread_mutex_lock(?pthreaad_mutex_t *mutex) |
?解鎖?????????int pthread_mutex_unlock(?pthreaad_mutex_t *mutex) |
?銷毀鎖? ? ? int pthread_mutex_destroy(?pthreaad_mutex_t *mutex) |
參數:所創建的鎖地址 |
返回值: 成功:0 失敗:非零 |
2.同步與異步? ?
? ? ? ? 異步:多任務各自執行各自的任務,互相之間沒有直接干擾。
? ? ? ? 同步:多個任務中的某些步驟按照先后順序執行。
2.1線程間同步:
多個線程在某個任務執行過程中具有先后順序
2.1.1信號量(sem):
實現線程間同步(使用同步方式訪問臨界資源,可以達到互斥的效果)
2.1.2信號量使用:
1.定義信號量對像? ? ? ? ? sem_t sem
2.初始化? ? ? ? ? ? ? ? ? ? ? ? ?sem_init()
3.申請信號量:P操作????????
4.釋放信號量:V操作????????
5.銷毀????????????????????????????????
int sem_init(sem_t *sem,int pshared,unsigned int value) |
功能:初始化一個信號量 |
參數: sem:信號量的地址 pshared:同一個進程間的線程間 0//不同進程間非0 value:初始化的資源數 |
返回值: 成功 0 失敗 -1 |
申請 | ? int sem_wait(?sem_t *sem) |
當申請的信號量資源數>0,sem_wait表示申請到了該信號量,信號量資源數-1) | |
當申請的信號量資源數=0,sem_wait阻塞等待信號量的釋放 | |
?釋放 | ? int sem_post(?sem_t *sem) |
該信號量的資源數自動+1 | |
?銷毀 | ? int sem_destroy(?sem_t *sem) |
三、進程通信
同一主機進程間通信:
3.1無名管道
用于同一主機下,具有親緣關系的進程間通信。
1.創建一個管道并打開 int pipe(int pipefd[2]);(pipefd[0],管道的讀端,pipefd[1]管道的寫端)?
2.讀管道? ? read();
3.寫管道? ? write();
4.關閉管道 close();
5.刪除管道 remove();
3.2有名管道
用于同一主機下,具有任意關系的進程間通信。
3.3信號
3.4共享隊列
3.5消息隊列
3.6信號燈
不同主機進程間通信:
3.7網絡套接字
四、補充
*memset(void *s,int c,size_t n);(將內存清成指定字節)
? ? ?字符串首地址,修改成的字符,清幾個