来看看:Linux操纵体系多线程同步Mutex
给你装的系统里为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中是自由的,那就发挥自己的权利; Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。 尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。 对Linux命令熟悉后,你可以开始搭建一个小的Linux网络,这是最好的实践方法。Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。 工具书对于学习者而言是相当重要的。一本错误观念的工具书却会让新手整个误入歧途。目前国内关于Linux的书籍有很多不过精品的不多。 在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。 以前觉得Linux就跟dos一样,全是用命令窗口,相对于窗口界面来说多麻烦呀。 选择交流平台,如QQ群,网站论坛等。
页:
[1]