我正在开发一个应用程序,它有几种不同的 zeromq 套接字类型相互通信,我做了很少的线程编程。我目前正在考虑的事情有 2 个线程,一个用于从 xrec 套接字推拉,另一个线程将消息传递到一对套接字。
我正在考虑使用一个简单的数组来推送/移动或弹出一个简单的内部队列中的消息。我怀疑会有很多实际的排队,但这似乎是一个很好的设计。我想我可以在 a.size > max 上添加一个短路
- 想知道下面的代码是线程安全的吗?
- 我可以做些什么来测试代码的线程安全性?
- 有什么我应该注意的吗?
...我最担心的是 << 就地修改
require 'thread'
m = Mutex.new
endl = false
a = []
t1 = Thread.new do
runs = 0
while !endl
runs += 1
msg = nil
m.synchronize{msg = a.pop}
puts "pulled -#{msg}-" if msg
sleep(0.001)
end
puts "t1 exiting runs: #{runs}"
end
t2 = Thread.new do
while !endl
puts "endl is #{endl}"
s = $stdin.gets
s.chomp!
if s == 'end'
puts "end found... trying to exit"
m.synchronize {endl = true}
elsif s == 'blast'
100.times.each_with_index do |item,i|
m.synchronize{a << i}
end
else
m.synchronize {a << s}
puts "ECHO: #{s}"
end
end
puts "t2 exiting endl was #{endl}"
end
t1.join()
t2.join()
编辑:
在这一点上,我将使用 inproc 和消息传递来避免使用任何互斥锁。它应该足够快,如果我需要剥离一个组件,我可以轻松做到。