linux執行緒同步機制-互斥鎖
阿新 • • 發佈:2021-05-04
一、介紹
對於多執行緒來說,執行緒的執行順序並不是固定的,無法預料哪個執行緒先執行哪個執行緒後執行,所以需要一種同步機制,另外,不同的執行緒訪問同一個公共區域,如果這個公共區域同一時刻只能被一個執行緒訪問,這個時候也需要一個機制協調不同執行緒,這裡就有了我們的互斥鎖
二、互斥鎖相關函式
#include <pthread.h>
pthread_mutex_t lock; /* 互斥鎖定義 */
pthread_mutex_init(&lock, NULL); /* 動態初始化, 成功返回0,失敗返回非0 */
pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER; /* 靜態初始化 */
pthread_mutex_lock(&lock); /* 阻塞的鎖定互斥鎖 */
pthread_mutex_trylock(&thread_mutex);/* 非阻塞的鎖定互斥鎖,成功獲得互斥鎖返回0,如果未能獲得互斥鎖,立即返回一個錯誤碼 */
pthread_mutex_unlock(&lock); /* 解鎖互斥鎖 */
pthread_mutex_destroy(&lock) /* 銷燬互斥鎖 */
使用流程
1、建立互斥鎖
2、加鎖
3、解鎖
4、銷燬互斥鎖
三、使用
1、不帶互斥鎖的執行緒
#include <pthread.h>
#include <stdio.h>
void *print_msg(void *arg){
int i=0;
for(i=0;i<5;i++){
printf("output : %d\n",i);
usleep(100);
}
}
void *print_msg1(void *arg){
int i=0;
for(i=0;i<5;i++){
printf ("output : %d\n",i);
usleep(100);
}
}
int main(int argc,char** argv)
{
pthread_t id1;
pthread_t id2;
pthread_create(&id1,NULL,print_msg,NULL);
pthread_create(&id2,NULL,print_msg1,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 1;
}
2、帶互斥鎖的執行緒
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex;
void *print_msg(void *arg)
{
int i=0;
pthread_mutex_lock(&mutex);
for(i=0;i<5;i++)
{
printf("output : %d\n",i);
usleep(100);
}
pthread_mutex_unlock(&mutex);
}
void *print_msg1(void *arg)
{
int i=0;
pthread_mutex_lock(&mutex);
for(i=0;i<5;i++)
{
printf("output : %d\n",i);
usleep(100);
}
pthread_mutex_unlock(&mutex);
}
int main(int argc,char** argv)
{
pthread_t id1;
pthread_t id2;
pthread_mutex_init(&mutex,NULL);
pthread_create(&id1,NULL,print_msg,NULL);
pthread_create(&id2,NULL,print_msg1,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_mutex_destroy(&mutex);
return 1;
}