首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程互斥锁似乎没有阻塞

线程互斥锁似乎没有阻塞
EN

Stack Overflow用户
提问于 2013-09-10 19:05:09
回答 2查看 671关注 0票数 0

我有下面的小西纳特拉计划。它只需打印当前时代的时间,然后在返回前睡上一秒

代码语言:javascript
复制
require 'rubygems'
require 'sinatra'

get '/' do
    Thread.new do 
        $mutex.synchronize do
            stream do |out|
                out << "\n" << Time.now.to_i 
                sleep 1
            end
        end
    end.join
end

$mutex = Mutex.new

我希望互斥强制web请求按顺序处理。然而,根据这一检验标准,情况似乎并非如此:

代码语言:javascript
复制
$ for i in $(seq 5) ; do curl localhost:4567/ & disown; done
1378839480
1378839480
1378839480
1378839480
1378839480

正如您所看到的,五个同时请求的结果都会产生相同的时间。

我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2013-09-10 21:03:43

Sinatra有一个单请求并发锁选项:

代码语言:javascript
复制
require 'rubygems'
require 'sinatra'

set :lock, true

get '/' do
  time = Time.now.to_i
  sleep 1
  time.to_s
end
票数 3
EN

Stack Overflow用户

发布于 2013-09-10 19:34:59

我想我想明白了。流调用启动一个立即返回的后台作业。因此互斥锁被快速解锁,允许处理一个新请求。

将代码移到流块之外的代码修复了它:

代码语言:javascript
复制
get '/' do
    Thread.new do 
        $mutex.synchronize do
            result = "\n" + Time.now.to_i
            sleep 1
            stream do |out|
                out << result
            end
        end
    end.join
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18726932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档