线程同步(多线程协同使用有限资源)

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);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值