你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux 多线程信号量同步

[日期:2016-10-12] 来源:Linux社区  作者:xiaojiang1025 [字体: ]

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("\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;
}

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-10/135940.htm

linux
相关资讯       Linux多线程  Linux多线程同步 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保���或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款