Linux应用程序互斥锁mutex

       mutex从本质上说就是一把锁,在应用层提供对共享资源的保护访问。

(1)初始化
  在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。通过pthread_mutex_init进行初始化,并且在释放内存(free)前需要调用pthread_mutex_destroy.
  原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restric attr);
              int pthread_mutex_destroy(pthread_mutex_t *mutex);
 返回值:成功则返回0,出错则返回错误编号。

(2)互斥操作
  对共享资源的访问,要对互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。
  首先说一下加锁函数:
  int pthread_mutex_lock(pthread_mutex_t *mutex);
  int pthread_mutex_trylock(pthread_mutex_t *mutex);
返回值: 成功则返回0, 出错则返回错误编号。说明:具体说一下trylock函数,这个函数是非阻塞调用模式,也就是说,如果互斥量没被锁住,trylock函数将把互斥量加锁,并获得对共享资源的访问权限;如果互斥量被锁住了,trylock函数将不会阻塞等待而直接返回EBUSY,表示共享资源处于忙状态。
  再说一下解锁函数:
  原型: int pthread_mutex_unlock(pthread_mutex_t *mutex);

返回值: 成功则返回0, 出错则返回错误编号。

(3)实例

        如果对一个mutex变量testlock,执行了第一次pthread_mutex_lock(testlock)之后,在unlock(testlock)之前的这段时间内,如果有其他线程也执行到了pthread_mutex_lock(testlock),这个线程就会阻塞住,直到之前的线程unlock之后才能执行,由此,实现同步,也就达到保护临界区资源的目的。

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

void *fun1(void *arg);
void *fun2(void *arg);

int buffer = 0;
pthread_mutex_t mutex;
int running = 1;

int main(void )
{
    pthread_t pt1;
    pthread_t pt2;

    pthread_mutex_init(&mutex,NULL);

    pthread_create(&pt1,NULL,fun1,(void*)&running);
    pthread_create(&pt2,NULL,fun2,(void*)&running);

    usleep(1000);
    running=0;
    pthread_join(pt1,NULL);
    pthread_join(pt2,NULL);
    pthread_mutex_destroy(&mutex);
    return 0;
}

void *fun1(void *arg)
{
    while(*(int *)arg)
    {
				//pthread_mutex_lock(&mutex);
        printf("in fun1 before add , buffer is : %d\n",buffer);
        usleep(2);
        buffer++;
        printf("in fun1 after sleep and add one ,now buffer is %d \n",buffer);
				//pthread_mutex_unlock(&mutex);
        usleep(2);
    }
}

void *fun2(void *arg)
{
    while(*(int *)arg)
    {
				//pthread_mutex_lock(&mutex);
        printf("in fun2 before add , buffer is : %d\n",buffer);
        usleep(2);
        buffer++;
        printf("in fun2 after sleep and add one ,now buffer is %d \n",buffer);
				//pthread_mutex_unlock(&mutex);
        usleep(2);
    }

}
编译用gcc main.c -lpthread,为何要加后缀?因为pthread库不是Linux系统默认的库,连接时需要使用静态库libpthread.a,所以在线程函数在编译时,需要连接库函数。执行./a.out,结果

屏蔽互斥锁的运行结果


加上互斥锁的运行结果


 

http://blog.csdn.net/lne818/archive/2006/07/31/1005041.aspx

参考原文:http://www.linuxidc.com/Linux/2011-08/39987.htm

参考原文:http://m.blog.csdn.net/blog/leo115/8037869

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值