同步问题-旋锁模式

原创 2007年09月28日 08:25:00
下午在写计算机网络作业---一个WebServer(基于HTTP/1.0协议)
打算用线程池来实现 虽然实现了线程池,但是觉得很chuo(很烂),MayBe功能还不如来一个请求开一个线程,先不说这个,但是里面遇到的一个同步控制问题,让我迷惑了一阵子,最后查阅了Practical Java才明白了所以然,其实也就是一个旋锁模式(spin-lock pattern)觉得有必要写下来,如下:
......
synchronized(controller){
if (condition == null){
   try{
       condition.wait();
   } catch(Exceptione ){}
......
condition = null;
}
假设有两个线程需要运行这段代码,如果当condition满足的时候,一个线程抢到了锁,并向后面执行,并将condition赋值为null;如果这时候恰好通过notify唤醒了所有在condition上面等待的线程,则就不会再测试condition是否为null,而是从刚刚执行的condition.wait()后面开始执行,这样就会出现错误,因为codition现在已经是null了。所以应该改成这样:
......
synchronized(controller){
while (condition == null){
   try{
       condition.wait();
   } catch(Exceptione ){}
......
condition = null;
}
用循环,迫使其需要使用condition的线程反复测试,确保其正真获得其锁并执行时候codition是非空的
如果觉得还不清楚的可以去看侯捷翻译的那本Practical Java的中文版中的时间54:针对:wait()和notifyAll()使用旋锁(spain locks) 上面说得非常清楚
上面的错误在平时看来很容易发现,但是在具体用到同步操作时候(尤其是像我这种初学者^^),很容易犯,所以记下来,供自己和别人参考。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

内核同步--信号量,互斥体,自旋锁

在驱动编程中,这三个是用来管理竞态的有用工具。差别简述如下:     信号量:允许使用它的代码休眠,持有锁的时间可相对较长。     互斥体(锁):信号量的特殊形式。只有0、1两种状态     ...

Linux内核的同步机制-自旋锁

Linux内核的同步机制-自旋锁 1 推荐 Linux内核中的同步机制:原子操作、信号量、读写信号量和自旋锁的API,使用要求以及一些典型示例   一、引言 ...

线程同步-自旋锁与Mutex/信号量的区别和联系

POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API。线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用...

linux 内核同步机制-自旋锁与信号量及其区别

转自:http://www.360doc.com/content/12/0222/15/8555864_188631419.shtml 为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据...

操作系统概念-内核同步-自旋锁

有了原子操作,就可以了制作控制临界区的锁机制了。自旋锁就是其中的一个代表。 自旋锁机制可以用门和锁的例子来比喻。进程执行到某个临界区,相当于要进入一栋房子,这是进程会检查屋内是否有人(进程),如果屋...

linux 内核同步机制-自旋锁与信号量及其区别

这篇文章写得很不错!新人值得一看:http://www.360doc.com/content/12/0222/15/8555864_188631419.shtml 内核同步措施 为...

linux 内核同步机制-自旋锁与信号量及其区别

这篇文章写得很不错!新人值得一看:http://www.360doc.com/content/12/0222/15/8555864_188631419.shtml 内核同步措施 ...

Linux 同步机制:自旋锁

自旋锁的特点与适用场景Linux自旋锁spinlock同一时刻只能被一个可执行线程持有。当一个线程试图获取一个已经被持有的spin lock时,就会一直忙循环-选择-等待锁重新可用。忙等待免去了线程挂...

Linux内核中自旋锁同步分析

6-7-8章关于自旋锁同步中提出 ”中断处理下半部的操作中使用自旋锁尤其需要小心:下半部处理和进程上下文共享数据时,由于下半部的处理可以抢占进程上下文的代码,   所以进程上下文在对共享数据加锁前要禁...

linux内核学习(15)内核编程基本功之内核同步与自旋锁spinlock_t

Pro-I、内核同步与自旋锁:1、为什么要使用内核同步?同步使得共享数据结构(相对应的代码块—临界区)可以有节奏的被读/写。主要是由于内核控制路径的改变,而且它的改变是随机的。那么我们所要做的就是要保...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)