程序間也可以使用互斥鎖,來達到同步的目的。但應在pthread_mutex_init初始化之前,修改其屬性為程序間共享。mutex的屬性修改函式主要有以下幾個。
pthread_mutexattr_t型別: 用於定義mutex鎖的屬性
pthread_mutexattr_init函式: 初始化乙個mutex屬性物件
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
pthread_mutexattr_destroy函式: 銷毀mutex屬性物件 (而非銷毀鎖)
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
pthread_mutexattr_setpshared函式: 修改mutex屬性。
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
參2:pshared取值:
執行緒鎖:pthread_process_private (mutex的預設屬性即為執行緒鎖,程序間私有)
程序鎖:pthread_process_shared
例:使用mutex實現程序同步
#include
#include
#include
#include
#include
#include
#include
#include
struct mt
;int
main
(void)}
else
if(pid >0)
wait
(null);
}pthread_mutexattr_destroy
(&mm-
>mutexattr)
;//銷毀mutex屬性物件
pthread_mutex_destroy
(&mm-
>mutex)
;//銷毀mutex
munmap
(mm,
sizeof
(*mm));
//釋放對映區
最後結果顯然是300,而且可以看到,出現了明顯的程序交替。
借助 fcntl函式來實現鎖機制。 操作檔案的程序沒有獲得鎖時,可以開啟,但無法執行read、write操作。
fcntl函式: 獲取、設定檔案訪問控制屬性。
int
fcntl
(int fd,
int cmd,..
./* arg */
);
參2:
f_setlk (struct flock *)
設定檔案鎖(沒拿到鎖時非阻塞)
f_setlkw (struct flock *)
設定檔案鎖(沒拿到鎖時阻塞)w --> wait
f_getlk (struct flock *)
獲取檔案鎖
參3:struct flock ;
【思考】:多執行緒中,可以使用檔案鎖嗎?
多執行緒間共享檔案描述符,而給檔案加鎖,是通過修改檔案描述符所指向的檔案結構體中的成員變數來實現的,而多執行緒中操作的都是同乙個fd。因此,多執行緒中無法使用檔案鎖。(多執行緒中使用讀寫鎖)
多個程序對加鎖檔案進行訪問:
#include
#include
#include
#include
#include
#include
void
sys_err
(char
*str)
intmain
(int argc,
char
*ar**)
if((fd =
open
(ar**[1]
, o_rdwr)
)<0)
sys_err
("open");
f_lock.l_type = f_wrlck;
/*選用寫瑣*/
//f_lock.l_type = f_rdlck; /*選用讀瑣*/
//檔案鎖依然遵循「讀共享、寫獨佔」特性
f_lock.l_whence =
seek_set
; f_lock.l_start =0;
f_lock.l_len =0;
/* 0表示整個檔案加鎖 */
fcntl
(fd, f_setlkw,
&f_lock)
;//加鎖
printf
("拿到檔案鎖\n");
sleep(10
);//模擬對檔案進行操作
f_lock.l_type = f_unlck;
//解鎖
fcntl
(fd, f_setlkw,
&f_lock)
;//解鎖
printf
("解鎖\n");
close
(fd)
;return0;
}
依然遵循「讀共享、寫獨佔」特性。但如果程序不加鎖直接操作檔案,依然可訪問成功,但資料勢必會出現混亂。 linux程序間的同步方法
程序間通訊 ipc 方法主要有以下幾種 管道 fifo 共享記憶體 訊息佇列 訊號 1.管道中還有命名管道和非命名管道 即匿名管道 之分,非命名管道 即匿名管道 只能用於父子程序通訊,命名管道可用於非父子程序,命名管道就是fifo,管道是先進先出的通訊方式 2.訊息佇列是用於兩個程序之間的通訊,首先...
程序執行緒間同步
一 posix訊息佇列 通過固定名稱來建立和引用訊息佇列 1.可以認為是乙個訊息鍊錶,有足夠的許可權的執行緒可以往佇列中放置和獲取訊息。2.可指定優先順序 在空佇列放置訊息時候能夠產生乙個訊號或啟動乙個執行緒 3.建立訊息佇列mq open mq close 關閉 並不刪除 mq unlink 刪除...
程序間通訊,同步
程序間通訊 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 named pipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,可以用來控...