【发布时间】:2011-04-05 12:34:37
【问题描述】:
我对经典的有界缓冲区问题做了一个变体。
这是一个很大的不同,我需要了解线程安全的一个小技术障碍(而不是无休止地测试可能永远不会发生的情况)
我认为我不需要解释以下代码示例的评估情况
if(buffer1.BufferNotFull)
{
buffer1.Lock();
buffer1.AddValueAtIndex(value, index);
buffer1.Unlock();
}
基本上,我的 buffer1 有一个简单的条件变量(已更新和全部),它让我知道它是否未满,然后我获取一个锁,施展魔法,然后释放锁。
但是我可以简单地假设评估条件“是 buffernotfull”不能与另一个线程交错,只是在我的缓冲区中的最后一个插槽上写入?
(缓冲区其实是一个值数组,-1代表空,别问为什么^_^)
简而言之:就是评价
if(buffer1.BufferNotFull)
主体代码获取锁的线程安全
编辑
这是我现在用于整个系统的系统。我希望它有助于展示我的设计。考虑到我做这个设计纯粹是为了学习这些基本的同步机制。
访问缓冲区的线程的控制流
读取输入流(无需同步)
尝试:
- 来自生产者线程的写操作 在缓冲区 1 上请求锁定:
- 如果锁定被拒绝,继续请求 锁。
- 如果不满足条件变量, 等等
- 如果接受锁,执行写入 操作
- 解锁缓冲区 1 并通知其他 等待线程。
- 如果输入流为空且缓冲区 1 是死并请求死亡 过滤线程
尝试:
- 从过滤器读取操作 buffer1 上的线程请求锁定:
- 如果锁被拒绝,继续请求锁
- 如果接受锁,则执行读取 操作(将值替换为 -1) 并将值存储在线程中 应用过滤器后。
- 如果不满足条件变量, 等等。
- 解锁缓冲区 1 并通知其他 等待线程。
- 如果缓冲区 1 和缓冲区 2 为空并且 存在死亡请求,死亡。
尝试:
- 来自过滤器的写操作 buffer2 上的线程请求锁定:
- 如果锁被拒绝,继续请求锁
- 如果接受锁,执行写入 操作(与过滤 结果)。
- 如果不满足条件变量, 等等。
- 解锁缓冲区2并通知其他 等待线程。
- 如果缓冲区 1 和缓冲区 2 为空并且 存在死亡请求,发送死亡 请求消费者线程并死掉。
尝试:
- 对缓冲区 2 的读取操作从 消费者线程
- 如果锁被拒绝,继续请求锁
- 如果接受锁,则执行读取 操作(将值替换为 -1) 并直接输出变量 到控制台上。
- 如果不满足条件变量, 等等。
- 解锁缓冲区 2 并通知其他 等待线程。
- 如果缓冲区 2 为空且死亡 请求存在,死亡。
各个线程操作的控制流
获取锁 检查条件变量 如果是,写/读操作 如果NO,等待notfiy 解锁
我将构建和测试实现的最后一部分并进行编辑,以查看接受的答案是否确实给我带来了结果,但这可能需要一些时间
【问题讨论】:
标签: java multithreading thread-safety theory