Linux 多线程信号量同步

如果有可用的资源(信号量值>0),则此操作所在的进程占用一个资源(此时信号量值减1,进入临界区代码);

如果没有可用的资源(信号量值=0),则此操作所在的进程被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。

V操作:

如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程;如果没有进程等待它,则释放一个资源(即信号量值加1)。

信号量模型

定义信号量 sem_t sem

初始化信号量 sem_init()

获取信号量,信号量的数值-1 sem_wait();

访问共享资源

释放一个信号量,及信号量的数值+1 sem_post();

如果不再使用信号量,则销毁信号量 sem_destroy()

例子 #include<stdio.h> #include<stdlib.h> #include<pthread.h> #include<string.h> char* buf[5]; int pos; //1.定义互斥量 pthread_mutex_t mutex; void* task(void* pv){ //3.使用互斥量进行加锁 pthread_mutex_lock(&mutex); //4.访问共享内存 buf[pos]=(char*)pv; sleep(1); pos++; //5.使用互斥量进行解锁 pthread_mutex_unlock(&mutex); } main(){ //2.初始化互斥量 pthread_mutex_init(&mutex,NULL); pthread_t thread; pthread_create(&thread,NULL,task,(void*)"zhangfei"); pthread_t thread2; pthread_create(&thread2,NULL,task,(void*)"guanyu"); pthread_join(thread,NULL); pthread_join(thread2,NULL); //打印字符指针数组中的有效数据 int i=0; for(i=0;i<pos;i++){ printf("%s ",buf[i]); } printf("\n"); //6.如果不再使用则销毁互斥量 pthread_mutex_destroy(&mutex); return 0; } #include<stdio.h> #include<stdlib.h> #include<pthread.h> #include<string.h> #include<semaphore.h> char* buf[5]; int pos; //1.定义信号量 sem_t sem; void* task(void* pv){ //3.使用信号量,-1 sem_wait(&sem); //4.访问共享内存 buf[pos]=(char*)pv; sleep(1); pos++; //5.使用信号量进行解锁 sem_post(&sem); } main(){ //2.初始化信号量 sem_init(&sem,0,1); pthread_t thread; pthread_create(&thread,NULL,task,(void*)"zhangfei"); pthread_t thread2; pthread_create(&thread2,NULL,task,(void*)"guanyu"); pthread_join(thread,NULL); pthread_join(thread2,NULL); //打印字符指针数组中的有效数据 int i=0; for(i=0;i<pos;i++){ printf("%s ",buf[i]); } printf("\n"); //6.如果不再使用则销毁信号量 sem_destroy(&sem); return 0; }

本文永久更新链接地址

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/464bdc3626e415b020825aeb7390da9e.html