中国IT职业教育领先品牌
精品课程 全程面授
Linux编程培训哪个好
想知道Linux编程培训哪个好?先来了解一下什么是Linux编程吧!
Linux编程,比需要了解线程的问题。 线程间通信之信号量
线程的信号量主要就是实现对公共资源的一种控制管理。当公共资源增加时,信号量的值增加;当公共资源减少时,信号量的值减少;只有信号量的值大于0时,才能访问信号量所代表的公共资源。其实功能和之前的ucos的信号量功能类似。
1 线程信号量初始化sem_init
intsem_init(sem_t *sem, intpshared, unsigned int value); 功能介绍:
该函数主要的功能是创建一个信号量,设置该信号量的值,并且设置信号量的使用范围。信号量创建成功后,可以对其进行加减操作。 参数说明:
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
第一个参数sem是一个指向信号量结构的指针,当信号量初始化成功后,可以的这个信号量指针进行加减操作;第二个参数表示信号量的共享属性,当其值不为0时,信号量可以在进程间共享,如果等于0,则只能在同一个进程中的多个线程间共享;第三个参数用于设置信号量初始化时候的值。 2 线程信号量增加函数sem_post
intsem_post(sem_t *sem); 功能介绍:
该函数用于增加信号量的值,每次增加值为1。当有线程在等待该信号量,则等待信号量返回,不增加信号量的值。 参数说明:
sem参数是初始化时候创建的信号量结构体,用于记录信号量值得参数。 3 线程信号量减少函数sem_wait
intsem_wait(sem_t *sem); 功能介绍:
该函数用于减少信号量的值,每次减少值为1。当信号量的值为0,则线程会阻塞一直等待信号量的值大于0为止,当值为0时,不在减少。 参数说明:
sem参数是初始化时候创建的信号量结构体。 4 线程信号量的销毁函数sem_destroy
intsem_destroy(sem_t *sem); 功能介绍:
函数用于释放创建的信号量。
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
参数说明:
sem参数是初始化时候创建的信号量结构体。
使用线程的信号量进行通信,可以有效的对线程资源进行合理的分配,同时可以使线程以一个合理的方式进行调度。下面的代码是一个小小的实例,用很常规的方法来使用信号量,当线程获得获得信号量之后,在处理完相应的操作之后会主动的释放掉信号量。其实可以根据信号量的wait和post自己设计使用信号量。不过需要注意的是在wait和post函数分开使用时,可能会因为线程优先级等问题,post和wait被调用的次数不是对等的,这时候这时候可能出现的问题是不可控的,在这种方式设计程序时,需要把大部分的情况考虑进去,当然可能出现的情况的种数也是从0到1质变,从1到n量变得过程。
1 #include 2 #include 3 #include 4 #include
6 sem_tsem; 7 intsemValue; 8
9 void *pthread_wait(void *argv) 10 { 11
while(1)
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
{ 13
sem_wait(&sem); 14
sem_getvalue(&sem, &semValue); 15
printf(\"This is in phtread WAIT function! sem = %d\\n\", semValue); 16
sem_post(&sem); 17
sleep(1); 18
} 19
pthread_exit(\"exit wait pthread!\\n\"); 20 } 21
22 void *pthread_post(void *argv) 23 { 24
while(1) 25
{ 26
sem_wait(&sem); 27
sem_getvalue(&sem, &semValue); 28
printf(\"This is in phtread POST function! sem = %d\\n\", semValue); 29
sem_post(&sem); 30
sleep(1); 31
}
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
32
pthread_exit(\"exit post pthread!\"); 33 } 34
35 intmain(void) 36 { 37
pthread_tpt[2]; 38
void *ret; 39
40
sem_init(&sem,0,2); 41
pthread_create(&pt[0], NULL, &pthread_wait, NULL); 42
pthread_create(&pt[1], NULL, &pthread_post, NULL); 43
pthread_join(pt[0], &ret); 44
printf(\"return value %s\", ret); 45
pthread_join(pt[1], &ret); 46
printf(\"return value %s\", ret); 47
48
return 0; 49 }
上面代码的运行结果如下,因为是线程采用了无限循环的方式,所以pthread_exit和pthread_join不会执行到。
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
如果将上面代码中的第26行注释掉,运行结果如下,可以看到信号量的值一直在增加,就如上面提到的因为sem_wait函数和sem_post函数不能同时使用时,会出现一些不可控的运行结果。也可以利用这种情况,设计程序。
以上就是千锋Linux学院的学习笔记。 另附心得体会一篇:
从零基础开始学Linux或者是转行学习Linux,参加培训会保证你在单位时间内学到更多,毕竟随着Linux行业的快速发展,未来必将会面临更多的竞争,所以只有不遗余力的把自己打造成一把利剑,从专业度到职业素质,只有比别人更突出和优秀,才能够在这个相互选择的世界当中拥有更多的选择权利。现在想要学习Linux技术,只有通过参加培训才可以保证快速掌握所学知识和技能,所
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
以培训是比较靠谱的。
Linux编程培训哪个好?千锋教育的Linux课程专注于当前热门的Linux相关技术,就Linux而言,内容全面而细致的。Linux教学团队由众多名师打造,拥有多年教学经验和高超的Linux授课技巧和实战视野,让你理论和实战兼得。
千锋教育www.daodoc.com