Skip to content

线程同步之互斥量

线程同步之互斥量

互斥量可以阻止某个线程执行,互斥量可以保证先后执行
  • 互斥量就是保证了指令的原子性
    • 原子性
      • 原子性是指一系列操作不可被中断的特性
      • 这一系列操作要么全部执行完成,要么全部没有执行
      • 不存在部分执行部分未执行的情况
  • 互斥量是最简单的线程同步的方法
  • 互斥量(互斥锁),处于两态之一的变量:解锁和加锁
  • 两个状态可以保证资源访问的串行
  • 操作系统直接提供了互斥量的API
  • 开发者可以直接使用API完成资源的加锁、解锁操作
  • pthread_mutex_t

互斥锁的例子

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

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 临界资源
int num = 0;

// 生产者
void *producer(void*){
    int times = 100000000;
    while(times --){
    pthread_mutex_lock(&mutex);
    num += 1;
    pthread_mutex_unlock(&mutex);
    }
}

// 消费者
void *comsumer(void*){
    int times = 100000000;
    while(times --){
    pthread_mutex_lock(&mutex);
    num -= 1;
    pthread_mutex_unlock(&mutex);
    }
}


int main(){
    printf("Start in main function.");
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, &producer, NULL);
    pthread_create(&thread2, NULL, &comsumer, NULL);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    printf("Print in main function: num = %d\n", num);
    return 0;
}