1. 程式人生 > 其它 >linux執行緒同步機制-互斥鎖

linux執行緒同步機制-互斥鎖

一、介紹
對於多執行緒來說,執行緒的執行順序並不是固定的,無法預料哪個執行緒先執行哪個執行緒後執行,所以需要一種同步機制,另外,不同的執行緒訪問同一個公共區域,如果這個公共區域同一時刻只能被一個執行緒訪問,這個時候也需要一個機制協調不同執行緒,這裡就有了我們的互斥鎖

二、互斥鎖相關函式

#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;  
}

在這裡插入圖片描述