【发布时间】:2016-04-16 14:09:01
【问题描述】:
我正在尝试编写一个多线程代码来实现一项耗时过多的任务的并行性。这是它的外观:
class A
attr_reader :mutex, :logger
def initialize
@reciever = ZeroMQ::Queue
@sender = ZeroMQ::Queue
@mutex = Mutex.new
@logger = Logger.new('log/test.log')
end
def run
50.times do
Thread.new do
run_parallel(@reciever.get_data)
end
end
end
def run_parallel(data)
## Define some local variables.
a , b = data
## Log some data to file.
logger.info "Got #{a}"
output = B.get_data(b)
## Send output back to zermoq.
mutex.synchronize { @sender.send_data(output} }
end
end
需要确保代码是线程安全的。跨线程共享和更改数据(如 @、@@、$ 没有适当的互斥锁)可能会导致线程安全问题。
我不确定如果我将数据传递给一个方法,这是否也会导致线程安全问题。换句话说,如果我在方法中没有使用任何@、@@、$,我是否必须确保run_parallel 中的代码部分必须包含在mutex 中?或者给定的互斥量定义是否足够?
mutex.synchronize { @sender.send_data(output} }
【问题讨论】:
标签: ruby multithreading