线程学习(二)

线程同步

1、同步:同时起步,协调一致

2、线程同步:同步即协同步调,按预定的先后次序运行

指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其他线程为保证数据一致性,不能调用该功能。

3、互斥量(互斥锁)

pthread_mutex_t 只有0和1两个值

主要应用函数:

pthread_mutex_init:初始化一把互斥锁(初值可看作1)

pthread_mutex_destory

pthread_mutex_lock:会阻塞到锁被释放可以拿到

pthread_mutex_trylock:尝试一下就返回

pthread_mutex_unlock

在访问共享资源前加锁,访问后应立即解锁。锁的粒度应越小越好

4、死锁

1)线程试图对同一互斥量A加锁两次

2)线程1拥有A锁,请求获得B锁;线程2拥有B锁,请求获得A锁

5、读写锁:写独占、读共享,写锁优先级高

一把锁具有三种状态:

1、读模式下加锁状态(读锁)

2、写模式下加锁状态(写锁)

3、不加锁状态

主要应用函数:pthread_rwlock_t 

pthread_rwlock_init

pthread_rwlock_destory

pthread_rwlock_rdlock

pthread_rwlock_wrlock

pthread_rwlock_tryrdlock

pthread_rwlock_trywrlock

pthread_rwlock_unlock

6、条件变量:条件变量本身不是锁!但他可以造成线程阻塞,通常与互斥锁配合使用,给多线程提供一个会和的场所

主要应用函数:

pthread_cond_init

phread_cond_destory

pthread_cond_wait:

1)阻塞等待一个条件变量满足(参1)满足

2)释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex) 1、2两步为一个原子操作

3)当被唤醒,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁

pthread_mutex_lock(&mutex)

pthread_cond_timedwait:阻塞等待条件变量绝对时间:相对于1970年1月1日过去了多久-UMIX计时元年

!!正确用法:time_t cur=time(NULL);

                        struct timespec t;

                        t.tv_sec=cur+1;//定时一秒

                        pthread_cond_timedwait(&cond,&mutex,&t);

pthread_cond_signal:唤醒至少一个该条件变量阻塞函数

pthread_cond_broadcast:唤醒所有该条件变量阻塞函数

7、生产者消费者模型

8、信号量:线程/进程同步都可以用(和信号完全不一样):信号量的初值决定了占用信号线程的个数

进阶版互斥锁(1---->N)

主要应用函数:

sem_init

sem_destory

sem_wait :信号量大于0,则信号量--;信号量等于0,则造成线程堵塞(类似pthread_mutex_lock)

sem_trywait

sem_timedwait

sem_post:将信号量++,同时唤醒阻塞在信号量上的线程(类似pthread_mutex_unlock)

9、进程间同步

互斥量mutex:在pyhread_mutex_init初始化之前修改其属性为进程间共享,mutex属性修改函数主要有:

pthread_mutexattr_t mattr类型,用于定义属性

1)pthread_mutexattr_init

2) pthread_mutexattr_destory

3) pthread_mutexattr_setpshared

10、fcntl()和位图

借助fcntl()函数实现文件锁:fcntl(fd,F_SETLKW,&flock);

F_SETLK(try_lock)

F_SETLKW(lock wait) 加减锁都是他 通过参数 stuck flock 

F_GETLK

多线程无法使用文件锁!!!

哲学家吃面问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值