Linux-线程互斥-锁

互斥锁

    当一个共享资源的操作不是原子的,在多线程同时访问共享资源时可能会出现达不到预期的效果错误,为了解决共享资源操作竞争的问题,引入了互斥锁。

     1、访问共享资源前,必须申请该互斥锁,若处于开锁状态,则申请到锁对象,并立即占有该锁,以防止其他线程访问该资源;如果该互斥锁处于锁定状态,则阻塞当前线程。

     2、只有锁定该互斥锁的进程才能释放该互斥锁,其他线程试图释放无效。

    init
        pthread_mutex_t mutex_lock;
        pthread_mutex_init(&mutex_lock,NULL);
    lock
        pthread_mutex_lock(&mutex_lock);  以阻塞方式申请互斥锁;
        pthread_mutex_trylock(&mutex_lock)以非阻塞方式申请互斥锁;
    unlock
        pthread_mutex_unlock(&mutex_lock);

实例

    2个线程分别对全局变量count加加5000次,但由于操作count语句不是原子操作,会导致在最后给count内存赋值过程中被其他线程读取导致出错,这里要想不出错,2个办法:

    1、语句改为:count++;

    2、加互斥锁保护count资源;

#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include <sys/types.h>
#include <unistd.h>

int count = 0;
pthread_mutex_t mutex_lock;

void* pthread_run()
{
    int i = 0;
    int ret = 0;
    while(i < 5000)
    {
        pthread_mutex_lock(&mutex_lock);
        i++;
        ret = count;
        printf("process ID:%d,pthread ID:%lu,count:%d\n",getpid(),pthread_self(),count);
        count = ret + 1;
        pthread_mutex_unlock(&mutex_lock);
    }
    pthread_exit(NULL);
}
 
int main()
{
    pthread_t id1;
    pthread_t id2;

    pthread_mutex_init(&mutex_lock,NULL);
    pthread_create(&id1,NULL,&pthread_run,NULL);
    pthread_create(&id2,NULL,&pthread_run,NULL);
    pthread_join(id1,NULL);  
    pthread_join(id2,NULL);
    printf("count: %d\n",count);
    return 0;
}

内核线程锁

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值