问题标签 [race-condition]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 如何在没有竞争条件的情况下重命名()?
如果我想重命名A
为B
,但只有在B
不存在的情况下,天真的事情会检查是否B
存在(有access("B", F_OK)
或类似的东西),如果它不继续rename
. 不幸的是,这会打开一个窗口,在此期间其他进程可能会决定创建B
,然后它会被覆盖——更糟糕的是,没有迹象表明曾经发生过类似的事情。
其他文件系统访问功能不会受此影响 -open
有O_EXCL
(因此复制文件是安全的),最近 Linux 获得了一整套*at
系统调用,可以防止大多数其他竞争条件 - 但不是这个特定的(renameat
存在,但可以防止完全不同的问题)。
那么它有解决方案吗?
vb.net - 使用 parallel.for 将行添加到数据表
我有这个子:
这是由运行在 parallel.for 循环中的几个函数调用的。
问题是有时(完全随机)我得到一个错误:
上Dim ln = t_erori.Rows.Add
线。
我怀疑这是因为它试图两次添加同一行。我怎样才能使这项工作?或者我还能用什么方法来做到这一点?
我需要这个数据表,因为我的应用程序正在其中写入一些结果,但是任何其他存储与 parallel.for 一起使用的结果的方法都可以。
locking - 确保文件在尝试删除时未更改
在 POSIX 环境中,我想从磁盘中删除一个文件,但在删除它之前计算它的校验和,以确保它没有被更改。锁够了吗?我应该打开它,取消链接,计算校验和,然后关闭它(这样操作系统就可以删除它的 inode)吗?有什么方法可以确保没有其他进程在文件上有打开的文件描述符?
为了提供一些上下文,代码执行跨主机的文件同步,如果远程主机删除文件但文件正在本地更改,则有可能丢失数据。
asp.net - Facebook Connect 和 HTTP Cookies - 我怎样才能克服这种“竞争条件”
如果您想知道“比赛条件”是什么,它是系统中的一个缺陷,而它高度依赖于时间。有关更多信息,请参阅此处的 wiki 。
因此,我的条件与 Facebook Connect 和使用 ASP.NET 4.0 Web 应用程序(基于表单的身份验证 - IIS7)实现单点登录服务有关。
该过程本身(包括注销)运行良好,但是......
这是它不能完全 100% 工作的场景:
- 用户登录 Facebook。
- 用户导航到我的网站。
- 用户未自动登录(应该是)。
- 用户刷新页面,并自动登录。
当我在步骤 3 中对代码进行断点时 - Facebook Cookie 还不存在(在 中HttpContext.Current.Request.Cookies
)。
但是当页面重新加载时(第 4 步) - Facebook Cookie 就在那里。
对我来说,可能有很多方面:
我不确定这只是 Facebook尚未授予访问我的应用程序以访问 cookie 的情况(跨域握手延迟 - xd_receiver.htm),还是跨域 cookie 本身和 ASP 的问题。 NET 页面生命周期。
其他人处理过这个问题吗?
这不是“万能的”,但它很烦人(从用户的角度来看也不是很好)。
编辑:
好的,我现在注意到了一些奇怪的事情。如果我登录 Facebook(通过 Facebook),然后等待 20 秒,然后转到我的网站,它仍然没有让我登录。只有在第二次加载后它才会让我登录。所以也许这不是时间问题 - 为什么是否需要 2 次刷新才能读取 cookie?
为了消除一些混乱 - Facebook 设置 cookie(用户登录到 Facebook),我的网站读取这些 cookie。
这发生在每个页面请求上(每个页面上的用户控件中的逻辑)
因此,在第一次刷新时 - HttpContext.Request.Cookies 中没有任何内容。
在第二次刷新时,它们就在那里。
我认为这是因为 FB.Init 是在每个页面请求的客户端执行的。这就是初始化 cookie 的原因。因此,当您第一次访问我的网站(登录 Facebook 后)时,在服务器端(我在其中检查 cookie),此功能尚未运行。
所以我认为我在这里打了一场失败的战斗(试图访问cookie服务器端,即设置客户端)。
编辑2:
这是我的初始化代码(在 window.load 上运行):
我现在正在尝试做这样的事情:
但是我收到一个 JavaScript 错误 - “FB.getLoginStatus”不是一个函数。=(
这是因为我使用以下 JavaScript 库: http ://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US
而其他人说要使用这个: http ://connect.facebook.net/en_US/all.js
我正在查看新 JS API 的文档。
为了参考其他偶然发现这个线程的人,这里是“旧”JS API 的文档:http: //developers.facebook.com/docs/reference/oldjavascript/
因此,如果用户通过身份验证,我已经通过使用 FB.Connect.get_status() 和重新加载窗口解决了这个问题。
感谢大家的帮助。
如果其他人关心,这是我对问题的“解决方案”:
当然,您应该在执行 window.location.reload() 之前检查 Forms Authentication cookie,否则页面将一直刷新。=)
iphone - iPhone临时文件写入中的竞争条件(?)
我正在 iPad 模拟器中创建一些临时文件。为了测试我的文件创建,我创建了文件,然后将其读回。这是一些代码来显示这一点:
在最后一个函数将 UIImage 写入相册之前,我一个接一个地调用这些方法。
问题是,这总是在我的应用程序第三次执行时崩溃。第一次和第二次它成功地完成了所有这些并存储到专辑中。第三次它崩溃到主页。有任何想法吗?
c# - 在 C# 中处理竞争条件
我正在编写一个具有分层通信接口的应用程序。
这样做是为了从应用程序的用户界面部分抽象通信,并使其更具可扩展性/可维护性。
例如:
将上图中的每个框视为一个单独的类。
通用通信接口填充描述交易数据和通信“健康”的字符串变量,这些变量又通过一系列公共函数调用复制到应用程序。例如,应用程序会调用 App-Sub-System:
sText
由类中的其他函数异步填充。我相信在和下一行
之间发生了竞争情况。
有人可以建议一种避免或防止这种竞争状况的方法吗?会使用帮助,还是我应该这样做的另一种方式?string sRetVal = this.sText;
this.sText = null;
StringBuilder
javascript - 尝试同步 AJAX 请求
我一直在为我编写的 Facebook 游戏开发一项新功能。该游戏允许玩家在欧洲城市之间旅行并运送货物以获取利润。我正在添加的这个功能为游戏添加了寻路 AI:它允许玩家选择要前往的城市,然后游戏会自动将玩家的火车沿着轨道从起始城市移动到目的地城市。我正在使用 AJAX 和 setTimeout() 从后端获取数据,并使火车沿着连接城市的轨道移动。请参阅将(希望)包含对我正在尝试做的事情的更好理解的代码。
问题是 setTimeout() 被调用太频繁了。我放置了一个名为 statusFinalDest 的全局变量,它可能包含两个值:ENROUTE 和 ARRIVED。当火车在 ENROUTE 时,JS 火车运动函数使用 setTimeout 调用自身,直到后端返回 ARRIVED 的 statusFinalDest,此时火车运动超时循环(假设)终止。但是,后端进程每次调用一次 myEventMoveTrainManual(),而不是调用它的频率非常高,就好像它没有识别 statusFinalDest 的更改状态一样。我试图在代码中加入更多限制结构来结束这种过度行为,但它们似乎不起作用。
这是相关的 FBJS (Facebook JS) 代码:
这是后端 PHP 代码:
java - 使用 Swing 时的竞争条件 (?)
我已经从尝试通过 Penumbra 使用 OpenGL 转向尝试使用其 Graphics 上下文直接在 JPanel 上绘图。
这会很棒,除非我遇到了一些麻烦......我编译了我的代码,并且在 25 次中大约有 1 次,图形(它是示例的矩形)绘制得很好。其他〜24次,它没有。
这是我的代码:
功能draw-line
如下:
我不知道发生了什么。起初我以为是我正在研究的裁判,但后来我把它们拿出来,仍然有这些问题。我也重置了 lein 和 slime/swank 和 emacs。我很困惑。
像往常一样,任何帮助将不胜感激。我希望这是一个有答案的问题!最近,我似乎在问不可能的事情:)
locking - 不涉及两个进程的互斥
我有一个独特的问题。有两个进程(P0 和 P1)试图访问一个文件。P0 正在向文件写入信息,P1 正在读取信息。在 P0 完成写入之前 P1 正在读取的两者之间发生竞争条件。我考虑过使用锁、信号量等。但是,P1 存在于一组我不允许以任何方式更改的代码中,并且它目前没有实现来支持上述建议的修复。
有没有办法在不触及两组代码的情况下消除这种竞争条件?
c# - 为 SQL Server DB 列手动实现类似 IDENTITY 的增量时避免竞争条件
我正在构建一个使用 LINQ to SQL 的 ASP.NET MVC 2 站点。在我的网站访问数据库的地方之一,我认为可能存在竞争条件。
数据库架构
以下是相关数据库表的一些列,名为Revisions
:
- RevisionID - bigint、IDENTITY、PK
- PostID - bigint, FK to PK of
Posts
table - EditNumber - 整数
- 修订文本- nvarchar(最大)
在我的网站上,用户可以提交帖子并稍后编辑帖子。原始发帖人以外的用户可以编辑帖子 - 因此可以同时对单个帖子进行多次编辑。
提交 Post 时,会在表中创建一条记录,并在Posts
表中创建一条记录,Revisions
其中PostID设置为记录的 ID Posts
,RevisionText设置为 Post 文本,EditNumber 设置为 1。
编辑帖子时,仅Revisions
创建一条记录,其中EditNumber设置为比最新编辑编号高 1。
因此,EditNumber列指的是帖子被编辑了多少次。
递增EditNumber
我在实现这些函数时看到的挑战是增加EditNumber列。由于该列不能是IDENTITY,我必须手动操作它的值。
这是我的 LINQ 查询,用于确定新修订版应具有的EditNumber :
计算最大值并增加它可能会导致竞争条件。
有没有更好的方法来实现该功能?