【发布时间】:2017-08-13 21:54:49
【问题描述】:
我正在编写的 ruby 服务器出现问题。
服务器运行良好,直到您连接了多个客户端,然后它以循环方式发送消息,当我希望所有客户端同时获取消息时。
服务器应该抓取所有连接的客户端,然后等到我发出命令。问题是只有一个客户端正在获取命令,当我再次输入命令时,另一个客户端获取它等等
服务器
require 'socket'
mutex = Mutex.new
cv = ConditionVariable.new
server = TCPServer.open(2000)
@Comm="test"
Thread.new{
loop {
Thread.start(server.accept) do |client|
client.puts("Client accepted")
mutex.synchronize {
cv.wait(mutex)
client.puts("#@Comm")
client.close
}
end
}
}
loop {
system "clear" or system "cls"
print("Enter Command\n")
@Comm = gets()
mutex.synchronize {
cv.signal
}
}
客户
require 'socket' # Sockets are in standard library
hostname = 'localhost'
port = 2000
loop {
begin
s = TCPSocket.open(hostname, port)
system "clear" or system "cls"
while line = s.gets # Read lines from the socket
puts line.chop # And print with platform line terminator
end
s.close
rescue
next
end
sleep(0.5)
}
【问题讨论】:
-
您希望您的
mutex在这段代码中做什么?这是您的代码吗?您尝试了什么? -
Mutex 持有线程,直到我输入命令,然后它让线程继续,问题是只有一个客户端线程实际上继续。
-
ConditionVariable.wait不会那样做——当你调用.signal时,它只会唤醒一个线程;ConditionVariable的想法是保护只能以独占方式访问的资源。 -
我可以使用什么其他变量代替条件变量来运行所有线程?或者这不是Ruby的可能性
-
好吧,我说对了一半。
.signal只在条件变量上唤醒一个线程。但是请查看 ConditionVariable 上的.broadcast,我认为它可以满足您的需求。
标签: ruby multithreading sockets tcp