線程同步(多線程協同使用有限資源)

1)互斥量(mutex)
全局變量:pthread_mutex_t m;//定義互斥量
主函數: pthread_mutex_init(&m,NULL);//初始化
……操作…… //默認配置NULL
pthread_mutex_destory(&m);//註銷
線程函數:
pthread_mutex_lock(&m);//加鎖
pthread_mutex_unlock(&m);//解鎖

2)信號量(semphore):一個特殊的整形變量,支持P V操作,如果信號量的當前值爲0,P操作會阻塞當前線程的執行
全局變量:sem_t s;//定義信號量
主函數:int sem_init(sem_t *sem, int pshared, unsigned int value);//初始化
//0表可在不同進程間共享//n個廁所
int sem_destroy(sem_t *sem);//註銷
線程函數:
sem_wait(&m); //P操作,信號量加1,如果已經爲0依然操作,會阻塞線程,直到不爲0
sem_post(&m); //V操作,信號量減1

實現代碼:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
#define N 5
                    //加了關鍵字,操作系統不會把它調到寄存器中,一直在內存中
volatile int empty_flag=2;//被頻繁的訪問的量,系統會自動調到寄存器中用
pthread_mutex_t m;//互斥量
sem_t n;
void* ptr_fun(void* arg);
int main()             
{
//  pthread_mutex_init(&m,NULL);//互斥量初始化
    sem_init(&n,0,2);//信號量初始化
    pthread_t tid[N];
    int i;
    for(i=0;i<N;i++)
    {
        if(pthread_create(&tid[i],NULL,ptr_fun,(void*)i)!=0)
        {
            perror("pthread_create");
        }
    }
    for(i=0;i<N;i++)
    {
        pthread_join(tid[i],NULL);
    }
//  pthread_mutex_destroy(&m);//註銷互斥量
    sem_destroy(&n);
    return 0;
}
/*******5個人五個廁所
void* ptr_fun(void* arg)
{
    int p;
    p=(int)arg;
    srand(time(NULL));
    int t;
    t=rand()%5+1;
    printf("%d號進入廁所......\n",p);
    sleep(t);
    printf("%d號結束~\n",p);
}
*/
//5個人兩個廁所
void* ptr_fun(void* arg)
{
    int p;
    p=(int)arg;
    srand(time(NULL));
    int t;
    t=rand()%5+1;
/*
    while(empty_flag==0);//沒有廁所一直阻塞
    empty_flag--;//一有廁所就佔着//必須保證這兩句同時進行,否則發生錯誤

    pthread_mutex_lock(&m);//加鎖//1個一個進廁所
*/
    sem_wait(&n);//p操作
    printf("%d號進入廁所......\n",p);
    sleep(t);
//  empty_flag++;
//  pthread_mutex_unlock(&m);
    sem_post(&n);
    printf("%d號結束~\n",p);

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章