互斥量mutex的简单使用(实例讲解)

时间:2023-09-20 21:36:50 

几个重要的函数:

#include <pthread.h>

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutex_t *restrict attr);    //初始化mutex

int pthread_mutex_destroy(pthread_mutex_t *mutex);  //如果mutex是动态分配的,则释放内存前调用此函数。

int pthread_mutex_lock(pthread_mutex_t *mutex);    //加锁

int pthread_mutex_trylock(pthread_mutex_t *mutex);  //若已有其他线程占用锁,则返回EBUSY,否则返回0,不阻塞。

int pthread_mutex_unlock(pthread_mutex_t *mutex);   //解锁

例程:


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>

int a = 100;
int b = 200;

pthread_mutex_t lock;

void * threadA()
{
    pthread_mutex_lock(&lock);
    printf("thread A got lock!\n");
    a -= 50;
    sleep(3);        //如果不加锁,threadB输出会是50和200
    b += 50;        //加锁后会sleep 3秒后,并为b加上50 threadB才能打印
    pthread_mutex_unlock(&lock);
    printf("thread A released the lock!\n");
    a -= 50;
}

void * threadC()
{   
    sleep(1);
    while(pthread_mutex_trylock(&lock) == EBUSY) //轮询直到获得锁
    {
        printf("thread C is trying to get lock!\n");
        usleep(100000);
    }
    printf("thread C got the lock!\n");
    a = 1000;
    b = 2000;
    pthread_mutex_unlock(&lock);
    printf("thread C released the lock!\n");

}

void * threadB()
{
    sleep(2);                //让threadA能先执行
    pthread_mutex_lock(&lock);
    printf("thread B got the lock! a=%d b=%d\n", a, b);
    pthread_mutex_unlock(&lock);
    printf("thread B released the lock!\n", a, b);
}

int main()
{
    pthread_t tida, tidb, tidc;
    pthread_mutex_init(&lock, NULL);
    pthread_create(&tida, NULL, threadA, NULL);
    pthread_create(&tidb, NULL, threadB, NULL);
    pthread_create(&tidc, NULL, threadC, NULL);
    pthread_join(tida, NULL);
    pthread_join(tidb, NULL);
    pthread_join(tidc, NULL);
    return 0;
}

标签:mutex,互斥量
0
投稿

猜你喜欢

  • Android自定义View实现五子棋小游戏

    2022-05-18 14:56:59
  • Java 通过反射给实体类赋值操作

    2023-11-26 10:11:41
  • C语言函数封装及变量的作用域

    2022-10-06 10:14:47
  • Android Studio实现标题栏和状态栏的隐藏

    2022-11-29 08:45:10
  • Java 8中的18个常用日期处理(收藏)

    2023-03-02 02:01:54
  • 关于springboot加载yml配置文件的no字段自动转义问题

    2021-11-02 15:47:48
  • 利用Android封装一个有趣的Loading组件

    2023-01-07 16:25:28
  • Java Swing 多线程加载图片(保证顺序一致)

    2023-10-26 10:10:36
  • Mybatis模糊查询之三种定义参数方法和聚合查询、主键回填实现方法

    2023-06-27 03:23:44
  • 使用Logback设置property参数方式

    2022-07-28 01:06:01
  • Java使用poi操作excel实例解析

    2022-01-26 00:15:41
  • java使用Abobe Acrobat DC生成模板

    2022-04-14 21:03:12
  • 三分钟快速掌握Java中枚举(enum)

    2023-11-27 09:46:30
  • JAVA中的Token 基于Token的身份验证实例

    2023-11-09 18:05:09
  • Java编程探索之泛型擦除实例解析

    2022-08-30 02:13:35
  • 浅析java实现数据加密问题

    2023-03-21 02:54:04
  • IDEA类存在但找不到的解决办法

    2021-10-22 07:24:43
  • Java使用CountDownLatch实现网络同步请求的示例代码

    2022-04-23 18:40:52
  • Android 悬浮按钮之实现兔兔按钮示例

    2022-04-09 13:12:23
  • Java中的3种输入方式实现解析

    2021-10-04 00:16:47
  • asp之家 软件编程 m.aspxhome.com