程序間也可以使用互斥鎖,來達到同步的目的。但應在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 ...