并发和竞态(理论篇)

来源:互联网 发布:怎么在网络上推广产品 编辑:程序博客网 时间:2024/05/22 01:26

1. 信号量

信号量是为了解决共享资源问题而生的,通过著名的P/V操作可以获取和释放信号量,只有获得信号量的线程才可以访问共享资源,从而防止竞态的发生。

其中P操作有三种情况:

void down(struct semaphore *sem); // 如果信号量可以获得,信号量减一; 如果信号量不可以获得则阻塞进程并不可中断

int down_interruptible(struct semaphore *sem); // 如果信号量可以获得,信号量减一,函数返回零; 如果信号量不可以获得则阻塞进程但可以被中断,如果进程被中断,函数返回非零值

int down_trylock(struct semaphore *sem); // 如果信号量可以获得,函数返回零; 如果信号不可以获得,函数返回非零值

V操作只有一种情况:

void up(struct semaphore *sem); // 任何拿到信号量的线程都必须通过调用一次且仅有一次up函数来释放信号量

 

2. 读取者/写入者信号量

当共享资源可以被且仅被一个写入者访问,或者当共享资源可以被一个或多个读写者访问时,可以考虑使用这种特殊的信号量。

 

3. completion

当需要解决共享资源的同步访问问题时,可以考虑使用completion。

 

4. 自旋锁

"一个自旋锁是一个互斥设备,它只能有两个值:“锁定”和“解锁”"(LDD3 p119)

在不能阻塞代码中可以考虑使用自旋锁解决资源共享的问题。

 

5. 读取者/写入者自旋锁

类似于读取者/写入者信号量

转自:http://blog.csdn.net/victorsummer/article/details/6094543
原创粉丝点击