linux C sem 信号量
参考:http://www.cnblogs.com/eleclsc/p/5838790.html
linux 下线程同步的方法:
一、互斥锁
二、条件变量
三、信号量
条件变量在上一篇中已经做了些了解,在这里将记录我对信号量的使用以及理解。
在解决 多个线程轮流打印 字符的程序中,我最开始静静只是知道使用全局变量通过循环阻塞的 方式完成。不过经过一些查找资料学习,上一篇中我初步了解了使用条件变量实现那个功能。然后在学习过程中发现linux 还能通过信号量的方式完成线程同步的功能。
信号量基本方法以及概念直接引用过来:
如同进程一样,线程也可以通过信号量来实现通信,虽然是轻量级的。信号量函数的名字都以"sem_"打头。线程使用的基本信号量函数有四个。
- 信号量初始化。
int sem_init (sem_t *sem , int pshared, unsigned int value);
这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux 只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。 - 等待信号量。给信号量减1,然后等待直到信号量的值大于0。
int sem_wait(sem_t *sem); - 释放信号量。信号量值加1。并通知其他等待线程。
int sem_post(sem_t *sem); - 销毁信号量。我们用完信号量后都它进行清理。归还占有的一切资源。
int sem_destroy(sem_t *sem);
看过信号量的基本使用方法,我发现这个方法要比条件变量更简单。然后就是继续代码实现了
#include<semaphore.h> #include<pthread.h> #include<stdio.h> const int count=10; sem_t sem1,sem2,sem3; void init_info() { sem_init(&sem1,0,1); sem_init(&sem2,0,0); sem_init(&sem3,0,0); } void destroy_info() { sem_destroy(&sem1); sem_destroy(&sem2); sem_destroy(&sem3); } void *pth1(void *arg) { int i=count; while(i--){ sem_wait(&sem1); printf("A %d\n",i); sem_post(&sem2); } } void *pth2(void *arg) { int i=count; while(i--){ sem_wait(&sem2); printf("B %d\n",i); sem_post(&sem3); } } void *pth3(void *arg) { int i=count; while(i--){ sem_wait(&sem3); printf("C %d\n",i); sem_post(&sem1); } } int main() { init_info(); pthread_t pid1,pid2,pid3; pthread_create(&pid1,NULL,pth1,NULL); pthread_create(&pid2,NULL,pth2,NULL); pthread_create(&pid3,NULL,pth3,NULL); pthread_join(pid1,NULL); pthread_join(pid2,NULL); pthread_join(pid3,NULL); destroy_info(); return 0; }
浙公网安备 33010602011771号