【问题标题】:Ruby - MultiThreading TCP MessagesRuby - 多线程 TCP 消息
【发布时间】: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


【解决方案1】:

在 ConditionVariable 上使用 .signal 只会唤醒一个线程,但 .broadcast 会去唤醒所有等待发出信号的线程。

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 2021-02-28
    • 2010-12-11
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多