14、操作系统——互斥锁

目录

一、安装完成POSIX 的man 手册

二、互斥锁

1、互斥锁基本知识

2、操作步骤

3、API

(1)pthread_mutex_init(初始化互斥锁)

(2)加锁/尝试加锁/解锁/销毁

 4、代码

5、注意


一、安装完成POSIX 的man 手册

sudo apt-get install manpages-posix-dev

二、互斥锁

1、互斥锁基本知识

实现的路基为互斥的逻辑时可以使用互斥锁来实现(使用互斥锁可以有效的保护某一个共共享资源, 使得该资源在任何情况下都只能有一个 线程在访问。)

2、操作步骤

(1)初始化互斥锁资源 pthread_mutex_init()

(2)访问某个资源之前先上锁 pthread_mutex_lock()

(3)访问结束后应该解锁 pthread_mutex_unlock()

(4)当不再使用的时候应该销毁到锁资源 pthread_mutex_destroy ( )

3、API

(1)pthread_mutex_init(初始化互斥锁)

(2)加锁/尝试加锁/解锁/销毁

 4、代码

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

//共享内存
char * mem_map = NULL ;

// 定义一个线程间可以互相访问的锁资源
pthread_mutex_t lock ;

void *FUNC(void * arg)
{
    while ( 1 )
    {
        // 阻塞等待锁资源
        printf("FUNC:等待锁资源获得!!\n");
        pthread_mutex_lock(&lock);
        printf("FUNC:成功获得锁资源并已上锁!!\n");
        printf("FUNC:收到的消息为:%s\n" , mem_map );
        sleep(1);
        // 解锁
        pthread_mutex_unlock(&lock);
        printf("FUNC:已解锁!!\n");
    }
}

int main(int argc, char const *argv[])
{
    // 先初始化线程间的“共享内存”
    mem_map = calloc(128 , 1 );

    // 初始化互斥锁
    if(pthread_mutex_init(&lock, NULL ))
    {
        perror("init error");
        return -1 ;
    }

    // 创建线程
    pthread_t thread ;
    pthread_create(&thread, NULL, FUNC , NULL ); 

    while ( 1 )
    {
        // 阻塞等待锁资源
        printf("MAIN:等待锁资源获得!!\n");
        pthread_mutex_lock(&lock);
        printf("MAIN:成功获得锁资源并已上锁!!\n");
        fgets(mem_map , 128 , stdin );
        sleep(1);
        // 解锁
        pthread_mutex_unlock(&lock);
        printf("MAIN:已解锁!!\n");
    }
    return 0;
}

5、注意

锁是进程内部的锁资源,重新启动/把进程杀死后资源就消失了

猜你喜欢

转载自blog.csdn.net/weixin_45981798/article/details/129883362