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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值