线程安全ffi rzmq ruby和zeromq

线程安全ffi rzmq ruby和zeromq,ruby,thread-safety,zeromq,Ruby,Thread Safety,Zeromq,我正在开发一个应用程序,该应用程序有几种不同的zeromq套接字类型,可以相互通信,我很少进行线程编程。我目前正在考虑的东西有两个线程,一个用于从xrec套接字推拉,另一个用于将消息传递到pair套接字 我正在考虑使用一个简单的数组在一个简单的内部队列中推/移或弹出消息。我怀疑会有很多实际的排队,但这似乎是一个很好的设计。我想我可以在a.size>max上加一个短路 想知道下面的代码是线程安全的吗? 我能做些什么来测试代码的线程安全性? 有什么我应该注意的吗? 。。。我最担心的是Ok,我想我做错

我正在开发一个应用程序,该应用程序有几种不同的zeromq套接字类型,可以相互通信,我很少进行线程编程。我目前正在考虑的东西有两个线程,一个用于从xrec套接字推拉,另一个用于将消息传递到pair套接字

我正在考虑使用一个简单的数组在一个简单的内部队列中推/移或弹出消息。我怀疑会有很多实际的排队,但这似乎是一个很好的设计。我想我可以在a.size>max上加一个短路

想知道下面的代码是线程安全的吗? 我能做些什么来测试代码的线程安全性? 有什么我应该注意的吗?
。。。我最担心的是Ok,我想我做错了什么,因为我的代码中出现了malloc:memory corruption错误。这只发生在jruby上。
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()