|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
给你装的系统里为ubuntu12.04,它已经封装的很臃肿了,但是考虑到你没有很多时间投入其中,所以给你装了它,但是怎么用它提高开发效率,需要你在学习的过程中不断总结;
1.初始化:
在Linux下,线程的互斥量数据范例是pthread_mutex_t.在利用前,要对它举行初始化:
关于静态分派的互斥量,能够把它设置为PTHREAD_MUTEX_INITIALIZER,大概挪用pthread_mutex_init.
关于静态分派的互斥量,在请求内存(malloc)以后,经由过程pthread_mutex_init举行初始化,而且在开释内存(free)前必要挪用pthread_mutex_destroy.
原型:
intpthread_mutex_init(pthread_mutex_t*restrictmutex,constpthread_mutexattr_t*restricattr);
intpthread_mutex_destroy(pthread_mutex_t*mutex);
头文件:
前往值:乐成则前往0,堕落则前往毛病编号。
申明:假如利用默许的属性初始化互斥量,只需把attr设为NULL.其他值在今后解说。
2.互斥操纵:
对共享资本的会见,要对互斥量举行加锁,假如互斥量已上了锁,挪用线程会堵塞,直到互斥量被解锁。在完成了对共享资本的会见后,要对互斥量举行解锁。
起首说一下加锁函数:
头文件:
原型:
intpthread_mutex_lock(pthread_mutex_t*mutex);
intpthread_mutex_trylock(pthread_mutex_t*mutex);
前往值:乐成则前往0,堕落则前往毛病编号。
申明:详细说一下trylock函数,这个函数长短堵塞挪用形式,也就是说,假如互斥量没被锁住,trylock函数将把互斥量加锁,并取得对共享资本的会见权限;假如互斥量被锁住了,trylock函数将不会堵塞守候而间接前往EBUSY,暗示共享资本处于忙形态。
再说一下解所函数:
头文件:
原型:intpthread_mutex_unlock(pthread_mutex_t*mutex);
前往值:乐成则前往0,堕落则前往毛病编号。
3.逝世锁:
逝世锁次要产生在有多个依附锁存在时,会在一个线程试图以与另外一个线程相反按次锁住互斥量时产生。怎样制止逝世锁是利用互斥量应当分外注重的器材。
整体来说,有几个不成文的基础准绳:
对共享资本操纵前必定要取得锁。
完成操纵今后必定要开释锁。
只管短工夫地占用锁。
假如有多锁,如取得按次是ABC连环扣,开释按次也应当是ABC.
线程毛病前往时应当开释它所取得的锁。
示例:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>
pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;
intlock_var;
time_tend_time;
intsum;
voidpthread1(void*arg);
voidpthread2(void*arg);
voidpthread3(void*arg);
intmain(intargc,char*argv[])
{
pthread_tid1,id2,id3;
pthread_tmon_th_id;
intret;
sum=10;
end_time=time(NULL)+10;
pthread_mutex_init(&mutex,NULL);
ret=pthread_create(&id1,NULL,(void*)pthread1,NULL);
if(ret!=0)
perror("pthreadcread1");
ret=pthread_create(&id2,NULL,(void*)pthread2,NULL);
if(ret!=0)
perror("pthreadcread2");
ret=pthread_create(&id3,NULL,(void*)pthread3,NULL);
if(ret!=0)
perror("pthreadcread3");
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_join(id3,NULL);
exit(0);
}
voidpthread1(void*arg)
{
inti;
while(time(NULL)<end_time)
{
if(pthread_mutex_lock(&mutex)!=0)//lock
{
perror("pthread_mutex_lock");
}
else
printf("pthread1:pthread1lockthevariable
");
for(i=0;i<2;i++)
{
sleep(2);
lock_var++;
}
if(pthread_mutex_unlock(&mutex)!=0)//unlock
{
perror("pthread_mutex_unlock");
}
else
printf("pthread1:pthread1unlockthevariable
");
sleep(1);
}
}
voidpthread2(void*arg)
{
intnolock=0;
intret;
while(time(NULL)<end_time)
{
ret=pthread_mutex_trylock(&mutex);//trylock
if(ret==EBUSY)
printf("pthread2:thevariableislockedbypthread1
");
else{
if(ret!=0)
{
perror("pthread_mutex_trylock");
exit(1);
}
else
printf("pthread2:pthread2gotlock.Thevariableis%d
",lock_var);
if(pthread_mutex_unlock(&mutex)!=0)//unlock
{
perror("pthread_mutex_unlock");
}
else
printf("pthread2:pthread2unlockthevariable
");
}
sleep(1);
}
}
voidpthread3(void*arg)
{/*
intnolock=0;
intret;
while(time(NULL)<end_time)
{
ret=pthread_mutex_trylock(&mutex);
if(ret==EBUSY)
printf("pthread3:thevariableislockedbypthread1or2
");
else
{
if(ret!=0)
{
perror("pthread_mutex_trylock");
exit(1);
}
else
printf("pthread3:pthread3gotlock.Thevariableis%d
",lock_var);
if(pthread_mutex_unlock(&mutex)!=0)
{
perror("pthread_mutex_unlock");
}
else
printf("pthread3:pthread2unlockthevariable
");
}
sleep(3);
}*/
}
</p>
要多动手,不要怕什么搞坏了怎么办,你不搞坏,不去动手,就永远不会有收获,既然你在linux中是自由的,那就发挥自己的权利; |
|