1

私は、いくつかの異なる zeromq ソケット タイプが互いに通信するアプリに取り組んでいます。スレッド化されたプログラミングはほとんど行っていません。私が現在考えていることには、xrec ソケットからプッシュおよびプルするスレッドと、ペア ソケットにメッセージを渡すスレッドの 2 つのスレッドがあります。

シンプルな配列を使用して、メッセージをシンプルな内部キューにプッシュ/シフトまたはポップすることを考えています。実際の待ち行列が多くなるとは思えませんが、良いデザインのようです。a.size > max に短絡を追加できると思います

  • 以下のコードはスレッドセーフなのだろうか?
  • コードのスレッドセーフをテストするにはどうすればよいですか?
  • 私が気をつけなければならないことはありますか?

... << in place の修正が一番気になる

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 とメッセージ パッシングを使用します。それは十分に速くなければならず、コンポーネントを剥がす必要がある場合は簡単に行うことができます.

4

0 に答える 0