Welcome 微信登录

首页 / 操作系统 / Linux / Linux 多线程信号量同步

PV原子操作

P操作:
  • 如果有可用的资源(信号量值>0),则此操作所在的进程占用一个资源(此时信号量值减1,进入临界区代码);
  • 如果没有可用的资源(信号量值=0),则此操作所在的进程被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。
V操作:
  • 如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程;如果没有进程等待它,则释放一个资源(即信号量值加1)。

信号量模型

  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(" ");//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.使用信号量,-1sem_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(" ");//6.如果不再使用则销毁信号量sem_destroy(&sem);return 0;}本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-10/135940.htm