歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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("\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;
}

Copyright © Linux教程網 All Rights Reserved