程序間同步 互斥量和檔案鎖

2021-07-25 16:13:23 字數 2308 閱讀 5204

程序間也可以使用互斥鎖,來達到同步的目的。但應在pthread_mutex_init初始化之前,修改其屬性為程序間共享。mutex的屬性修改函式主要有以下幾個。

主要應用函式:

pthread_mutexattr_t mattr 型別:                用於定義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屬性。

intpthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);

參2:pshared取值:

執行緒鎖:pthread_process_private(mutex的預設屬性即為執行緒鎖,程序間私有)

程序鎖:pthread_process_shared

程序間mutex示例

程序間使用mutex來實現同步:

#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)); //釋放對映區

return 0;

}

借助 fcntl函式來實現鎖機制。  操作檔案的程序沒有獲得鎖時,可以開啟,但無法執行read、write操作。

fcntl函式:     獲取、設定檔案訪問控制屬性。

int fcntl(int fd, int cmd, ... /* arg */ );

參2:f_setlk (struct flock *) 設定檔案鎖(trylock)

f_setlkw (struct flock *) 設定檔案鎖(lock)w --> wait

f_getlk (struct flock *) 獲取檔案鎖

參3:struct flock ;

程序間檔案鎖示例 多個程序對加鎖檔案進行訪問:

#include #include #include void sys_err(char *str)

int main(int argc, char *argv)

if ((fd = open(argv[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("get flock\n");

sleep(10);

f_lock.l_type = f_unlck;

fcntl(fd, f_setlkw, &f_lock);

printf("un flock\n");

close(fd); return 0;

}

依然遵循「讀共享、寫獨佔」特性。但!如若程序不加鎖直接操作檔案,依然可訪問成功,但資料勢必會出現混亂。

多執行緒中,可以使用檔案鎖嗎?

多執行緒間共享檔案描述符,而給檔案加鎖,是通過修改檔案描述符所指向的檔案結構體中的成員變數來實現的。因此,多執行緒中無法使用檔案鎖。

程序間同步 互斥鎖與條件變數

include 互斥鎖 用於主動獲取共享資源時的互斥與等待 static pthread mutex t mutex pthread mutex initializer int pthread mutexattr init pthread mutexattr t int pthread mutexa...

Linux 執行緒同步 互斥量(互斥鎖)

1 執行緒同步的目的是不管執行緒之間的執行如何穿插,其執行結果都是正確的。即保證多執行緒執行下結果的確定性。2 同步就是讓所有執行緒按照一定的規則執行,使得其正確性和效率都有跡可循,即執行緒同步就是對執行緒之間的穿插進行控制。3 每個物件都對應於乙個 互斥鎖 的標記,這個標記用來保證在任一時刻,只能...

程序同步 互斥量

程序間也可以使用互斥鎖,來達到同步的目的。但應在pthread mutex init初始化之前,修改其屬性為程序間共享。mutex的屬性修改函式主要有以下幾個。pthread mutexattr tmattr 型別 用於定義mutex鎖的 屬性 int pthread mutexattr init ...