从两个不同的线程同时访问IO(串行端口)

时间:2012-11-06 09:26:23

标签: ruby multithreading thread-safety

我正在编写一个程序,可以从串口读取和写入。有两个线程;一个线程每隔500毫秒从串口读取一次,另一个线程每3秒写一次串口。

我遇到的问题是,因为500ms是3s的倍数,3s,6s,9s ...... 500ms循环无法读取/写入串行端口。有没有办法检查串口是否正在使用?

    counter = 0
    switchRelays = DoEvery([3], 20) do
        sp.write "@00 WR #{relays[counter]}\r"
        counter = (counter + 1) % relays.length
    end

    # This thread samples every 500ms.
    sp.write "@00 AI 0\r"
    sleep 0.2
    sample500 = DoEvery([0.5], 1.0/0.0) do |timeStamp|
        if switchRelays.alive? == false
            csv.close
            puts 'Done'
            sample500.exit
        else
            sleep 0.1
            analogueStatus = sp.readline
            sp.write "@00 AI 0\r"
        end
    end

1 个答案:

答案 0 :(得分:2)

这是共享对象的典型示例,您需要同步并发访问尝试。

例如,您可以使用Mutex

require 'thread'
semaphore = Mutex.new

a = Thread.new {
  semaphore.synchronize {
    # write to the port
  }
}

b = Thread.new {
  semaphore.synchronize {
    # write to the port
  }
})