linux 程序間同步

2021-10-08 01:17:35 字數 2835 閱讀 7066

程序間也可以使用互斥鎖,來達到同步的目的。但應在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 訊號量是乙個計數器,可以用來控...