什么是互斥锁

  • Post author:
  • Post category:其他


1.基本概念

互斥:控制2个进程使之相互排斥,不同时运行

同步:控制2个进程使之有先有后,次序可控

2.互斥锁

2.1基本概念

对共享数据进行锁定,同一时刻只有一个线程进行操作

这就相当于一个就当的房间,一个房间只能入住一人,当一人入住之后就上锁,若下一个人想入住,只有等前一人解锁之后才能入住

2.2函数接口

操作:初始化、加锁、解锁、销毁

定义

pthread_mutex_t m;

由于互斥锁被多条线程使用,因此将互斥锁定义为全局变量

初始化

未经初始化的互斥锁是无法被使用的。

初始化互斥锁的方法:

  1. 静态初始化
  2. 动态初始化

静态初始化

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

动态初始化

int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

参数:

  • mutex:互斥锁名称
  • attr:互斥锁属性

加锁和解锁

// 加锁
pthread_mutex_lock( &m );

// 解锁
pthread_mutex_unlock( &m );

销毁

int pthread_mutex_destroy(pthread_mutex_t *mutex);

实例代码

#include <stdio.h>
#include <unistd.h>
#include <pthread.h> //线程头文件

//定义锁
pthread_mutex_t m;
char global = 'X';

void *routine(void *arg)
{
    pthread_mutex_lock(&m);//加锁
    int i = 1000;
    while(i>0)
    {
        i--;
        fprintf(stderr,"[%c:%c]",*(char *)arg,global);
    }
    pthread_mutex_unlock(&m);

    pthread_exit(NULL);
}

int main(void)
{
//初始化锁
    pthread_mutex_init(&m,NULL);
    pthread_t t1,t2,t3;

    pthread_create(&t1,NULL,routine,"1");
    pthread_create(&t2,NULL,routine,"2");
    pthread_create(&t3,NULL,routine,"3");

    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
       pthread_join(t3,NULL);
    //销毁锁
    pthread_mutex_destroy(&m);

    pthread_exit(NULL);
}

结果图:



版权声明:本文为m0_50027156原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。