【Linux开发】linux线程同步方式互斥锁介绍及实例

本文详细介绍了Linux环境下线程互斥锁的使用方法,包括初始化、加锁、解锁和销毁等步骤,并通过示例代码展示了如何在多线程环境中实现资源共享的同步控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程的最大特点是资源的共享性,但资源共享中的同步问题 是多线程编程的难点。 linux 下提供了多种方式来处理线程同步,最常用的是互斥、读写锁、条件变量和信号量。

1、互斥锁(mutex

    通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);

int pthread_mutex_lock(pthread_mutex *mutex);

int pthread_mutex_destroy(pthread_mutex *mutex);

int pthread_mutex_unlock(pthread_mutex *

(1)先初始化锁init()或静态赋值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER

attr_t有:

PTHREAD_MUTEX_TIMED_NP:其余线程等待队列

PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争

PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;

PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争

(2)加锁,lock,trylock,lock阻塞等待锁,trylock立即返回EBUSY

(3)解锁,unlock需满足是加锁状态,且由加锁线程解锁

(4)清除锁,destroy(此时锁必需unlock,否则返回EBUSY,//Linux下互斥锁不占用内存资源

2、实例及运行结果

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

    #include <pthread.h>
       

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

    int tmp;

       

    void* thread1(void *arg)

    {

        printf("thread id is %d\n",pthread_self());
        pthread_mutex_lock(&mutex);

        tmp = 1;

        printf("Now a is %d\n",tmp);

        pthread_mutex_unlock(&mutex);

        return NULL;

    }
    void* thread2(void *arg)

    {

        printf("thread id is %d\n",pthread_self());
        pthread_mutex_lock(&mutex);

        tmp = 2;

        printf("Now a is %d\n",tmp);

        pthread_mutex_unlock(&mutex);

        return NULL;

    }

       

    int main()

    {

        pthread_t id1;
        pthread_t id2;

        printf("main thread id is %d\n", pthread_self() );

        tmp = 3;

        printf("In main func tmp = %d\n", tmp);;

        if (!pthread_create(&id1, NULL, thread1, NULL))

        {

            printf( "Create thread success!\n");

        }
        if (!pthread_create(&id2, NULL, thread2, NULL))

        {

            printf( "Create thread success!\n");

        }


        sleep(1);
        pthread_join(id1, NULL);
        pthread_join(id2, NULL);

        pthread_mutex_destroy(&mutex);

        return 0;

    }


gcc -o mutex mutex.c -lpthread;./mutex

执行结果如下:

main thread id is -1568364736
In main func tmp = 3
Create thread success!
thread id is -1568368896
Now a is 1
Create thread success!
thread id is -1576761600
Now a is 2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值