互斥量的概念:
互斥量是另一種用於多執行緒中的同步訪問方法,它允許程式鎖住某個物件,使得每次只能有乙個執行緒訪問它。為了控制對關鍵**的訪問,必須在進入這段**之前鎖住乙個互斥量,然後在完成操作之後解鎖。
共享記憶體的概念:
共享記憶體是由ipc為乙個程序建立的乙個特殊的位址範圍,它將出現在程序的位址空間中。其他程序可以把同一段共享記憶體段「連線到」它們自己的位址空間裡去。所有程序都可以訪問共享記憶體中的位址。如果乙個程序向這段共享記憶體寫了資料,所做的改動會立刻被有訪問同一段共享記憶體的其他程序看到。
擴充套件知識:
a. 子父程序或者非子父程序都可以訪問共享記憶體;
b. 共享記憶體在建立後需要使用ftruncate函式設定記憶體長度;
c. 對共享記憶體的操作有以下兩種方式:
使用mmap對映到當前程序(推薦使用這種方法);
用系統i/o操作函式write/read對其進行操作。
d.共享記憶體中的資料如果不清楚,將一直存在。
3.同步和互斥的區別:
互斥:是指某一資源同時只能允許乙個訪問者對其程序進行訪問,具有唯一性和排他性,但互斥沒有辦法限制訪問者對資源的訪問順序,所以訪問是無序的。
同步:表示在互斥的基礎上,利用某些機制對資源的有序訪問。
/* 互斥量相關函式*/
#include
int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutex_t *mutexattr);//初始化互斥量
int pthread_mutex_lock(pthread_mutex_t *mutex);//上鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);//解鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex);//銷毀互斥量
/*共享記憶體相關函式*/
#include
#include
#include
#include
int shm_open(const
char *name,int oflag,mode_t mode);//開啟或者建立乙個共享記憶體
int shm_unlink(const
char *name);//刪除乙個共享記憶體
int ftruncate(int fd,off_t length);//設定共享記憶體空間大小
int stat(const
char *file_name,struct stat *buf);//獲得檔案或者共享記憶體空間的資訊
//對於普通檔案, stat函式能獲得大概12條資訊, 如果函式的物件是共享記憶體空間,可以獲得以下的資訊:
struct stat
a. a執行緒通過共享記憶體將檔名傳送給b執行緒
b. b執行緒通過共享記憶體讀取檔名
c. b執行緒開啟檔案
d. b執行緒邊讀取檔案,邊將資料通過共享記憶體傳送給a執行緒
e. a執行緒通過共享記憶體獲取檔案資料
#include
#include
#include
#include
#include
#include
#include
#include
#define shm_name "/shm" //巨集定義共享記憶體空間名稱
#define shm_oflag o_rdwr|o_creat //設定建立的共享記憶體空間的標誌位
#define shm_mode 00600 //設定共享記憶體空間的許可權
#define shm_len 1024 //共享記憶體空間設定的長度
#define mmap_prot prot_write|prot_read
#define mmap_flags map_shared//對映在當前程序的標誌位
#define msg_len 1024
#define quit "quit"
#define file_flags o_rdonly
//定義2個互斥量
pthread_mutex_t mutex1;
pthread_mutex_t mutex2;
//對檔案操作定義的函式進行宣告
void *do_processa(void *);
void *do_processb(void *);
int main()
//設定共享記憶體空間長度
ftruncate(fd, shm_len);
//對映到當前程序
char *mmap_buf = mmap(null, shm_len, mmap_prot, mmap_flags, fd, 0l);
if(mmap_buf == mmap_failed)
memset(mmap_buf, 0, shm_len);//清空共享記憶體空間內容
//建立a, b執行緒
pthread_t p1, p2;
pthread_create(&p1, null, do_processa, (void *)mmap_buf);
pthread_create(&p2, null, do_processb, (void *)mamp_buf);
//**執行緒資源
pthread_join(p1, null);
pthread_join(p2, null);
close(fd);
munmap(mmap_buf, shm_len);//清空對映的共享記憶體空間的內容
return
0; err_mmap:
close(fd);
err_shm_open:
return -1;
}void *do_processa(void *argv)
; //獲取使用者輸入檔名
printf("請輸入檔名:\n");
fgets(buf, msg_len, stdin);//獲取標準輸入內容到緩衝區
ssize_t len = strlen(buf);//輸入內容的長度
//傳送檔名
pthread_mutex_lock(&mutex1);
memcpy(mmap_buf, buf, len - 1);
//通知b執行緒讀取
pthread_mutex_unlock(&mutex2);
//接收b執行緒資料
while(1)
}else
pthread_mutex_unlock(&mutex2);
}printf("執行緒a\n");
pthread_exit(null);
}void *do_processb(void *argv)
; ssize_t len;
pthread_mutex_lock(&mutex2);
//獲取檔名
memcpy(buf, mmap_buf, msg_len);
//開啟檔案
int fd = open(buf, file_flags);
if(fd < 0)
printf("開啟檔案:%s 成功\n", buf);
//邊讀檔案邊傳送資料到共享記憶體中
int index = 0;
while(1)
index = 1;
memset(buf, 0, msg_len);
len = read(fd, buf, msg_len);
if(len > 0)
else
pthread_mutex_unlock(&mutex1);
}ptintf("執行緒b\n");
pthread_exit(null);
}
多執行緒 共享互斥量
就像之前我們提過的一樣,很多執行緒需要互斥量進行相互鎖定,因為很多關鍵資料和操作並不是執行緒安全,多執行緒處理很有可能會出很大的問題。但是互斥量又會帶來乙個問題,我就舉個例子來說明 比如說,現在有一組資料,可以對它進行讀寫操作。但是一般情況讀寫要分開操作,因為這樣才可以讓後續處理更好的執行。很明顯的...
執行緒同步 互斥量
下面以乙個簡單的多執行緒程式來演示如何使用互斥量來進行執行緒同步。在主線程中,我們建立子執行緒,並把陣列msg作為引數傳遞給子執行緒,然後主線程呼叫函式pthread mutex lock對互斥量加鎖,等待輸入,輸入完成後,呼叫函式pthread mutex unlock對互斥量解鎖,從而使執行緒函...
執行緒同步 互斥量
互斥量的使用 執行緒同步之互斥量 include include include include include include include using namespace std 全域性變數,兩個執行緒都可以修改,因此修改的時候需要加鎖 int g value 0 互斥量 pthread mu...