【Linux基础】互斥锁

在同一进程中的线程是共享进程的资源和地址空间,因此对资源的访问每次只能有一个线程,这时就需要线程同步与互斥。线程间的同步(实指线程间的通信):通常一个线程相对于另一个线程的运行速度是不确定的,这就是说线程是在异步环境下运行,每个线程都会以不可预知的速度向前运行。但是相互合作的线程需要在某些确定点上协调工作,当一个线程到达了这些点后,除非另一进程已经完成了某些操作,否则就不得不停下来等待别的线程来完成这些操作,这就是线程间的同步。线程间的互斥(实指对同享资源约束访问):在多线程环境中,各线程可以共享各类资源,但有些资源一次只能允许一个线程使用,这种资源称“临界资源”,这时就需要线程间的互斥了。而在POSIX中,实现线程同步的方法有互斥锁(mutex)和信号量。
1. mutex互斥锁
互斥锁主要作用是用来保护由多个线程共享的数据和结构不被同时个修改。互斥锁只有两种状态:上锁和解锁。在同一时刻只能有一个线程拥有某个互斥上的锁,拥有上锁的线程能够对共享资源进行操作。若其它线程希望上锁一个已经上锁了的互斥锁,则该线程就会会挂起,直到上锁的线程释放掉互斥锁为止。其中,互斥锁分为快速互斥锁、递归互斥锁和检错互斥锁。快速互斥锁是指调用线程会阻塞直至拥有互斥锁为止;递归互斥锁能够成功地返回并且增加调用线程在互斥上加锁的次数,而检错互斥锁则为快速互斥锁的非阻塞版本,它会立即返回一个错误信息。
2. 数说明
使用互斥锁前首先得初始化,定义所创建的互斥锁是什么类型的互斥锁,使用的函数是pthread_mutex_init。对互斥锁上锁的函数是pthread_mutex_lock,对互斥锁判断上锁函数是pthread_mutex_trylock,对互斥锁解锁函数是pthread_mutex_unlock,对互斥锁消除函数是pthread_mutex_destroy.
3. 函数格式
(1) pthread_mutex_init 函数的语法要点

01.jpg (89.07 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-7 09:07 上传

4. 函数实例
(1)实例内容
创建两个线程,线程1执行计时累计,而线程2监视计时器的值。
(2)实例代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>
#define INDEX 10000000
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
long int ticks;
time_t end_time;
void thread1(void);
void thread2(void);
int main(int argc,char *argv[])
{
pthread_t id1,id2;
int ret;
end_time =time(NULL)+10;
pthread_mutex_init(&mutex,NULL);
ret=pthread_create(&id1,NULL,(void *)thread1,NULL);
if(ret!=0)
{
perror(" create pthread1 fail");
exit(0);
}
ret=pthread_create(&id2,NULL,(void *)thread2,NULL);
if(ret!=0)
{
perror(" create pthread2 fail");
exit(0);
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
exit(0);
}
void thread1(void)
{
long i;
while(time(NULL)<end_time)
{
if(pthread_mutex_lock(&mutex)!=0) 互斥锁上锁
{
perror("pthread_mutex_lock");
}
for(i=0;i<INDEX;++i)
{
++ticks;
}
if(pthread_mutex_unlock(&mutex)!=0) 互斥锁解锁
{
perror("pthread_mutex_unlock");
}
sleep(1);
}
}
void thread2(void)
{
int nolock=0;
int ret;
while(time(NULL)<end_time)
{
sleep(3);
ret=pthread_mutex_trylock(&mutex); 互斥锁判上锁
if(ret!=EBUSY)
{
if(ret!=0)
{
perror("thread_mutex_trylock");
exit(0);
}
printf("thread2:got lock at %ld ticks\n",ticks);
if(pthread_mutex_unlock(&mutex)!=0)
{
perror("pthread_muttex_unlock");
exit(0);
}
}else{
nolock++;
}
}
printf("thread2 missed lock %d times\n",nolock);
}
运行结果:
[root@localhost thread]# ./mutex
Thread2:got lock at 30000000 ticks
Thread2:got lock at 60000000 ticks
Thread2:got lock at 90000000 ticks
Thread2:got lock at 100000000 ticks
Thread2:missed lock 0 times
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值