节点中的哪些操作是线程安全的?

我正在使用这种方法来存储数据在一个全球arrays托pipe一个HTTP服务器,其中某些请求将操纵全局数组。

我有点担心在某些操作中遇到线程问题 – 主要是pushsplice 。 我想如果有一个请求有我迭代数组和基于条件删除项目,而另一个请求有我调用arrays上的.push() ,我会遇到问题。 任何人都可以确认吗?

我主要是写在C#中,即使是一个简单的增量是不是线程安全的(启动25个线程,做我++,不会保证,我说== 25完成后说)。

更新

我写了5个例子来说明我在说什么。 testing1和testing3工作正常。 testing2失败,因为通常会被称为线程问题(无论它们是否是实际的CPU线程)。 testing4和5,当并行运行似乎工作(这意味着他们没有碰撞问题,如testing2)。

http://pastebin.com/HcJHTDFY

我正在使用ApacheBench来testing1000个并行请求。

这导致我相信testing1和testing3工作正常,因为nodejs并行(阻塞?) 并行 javascript函数不会执行超过1个app.get('/test3'...)callback实例 。 只要你实现了setInterval / setTimeout,它就释放了nodejs来执行callback的另一个实例(非阻塞?)。

我真的只是想了解这个non-blocking I/O model究竟意味着什么。 这是否意味着“嘿,如果你需要非阻塞,可以用setTimeout和setInterval做非阻塞,否则我们将阻止任何其他的外层函数被运行,直到我们耗尽我们正在使用的函数” ? 我觉得知道这一点是必要的,这样我就不会陷入麻烦,认为我可以实现像/ test2这样的东西,并且完全安全。

另外,如果我试图用我的callback非阻塞,我应该真的调用setTimeout(code, 1) ? 或者,还有更好的方法?

都是线程安全的。

没有线程,JavaScript是单线程的,两个javascript语句不可能同时运行。

顺便说一句,你不应该使用全局variables,因为全局variables是邪恶的

编辑:

testing2失败,因为您使用asynchronouscallback,这意味着控制回到节点,它可以处理更多的请求。 这造成了所见的竞争状况。

在节点中,任何不是asynchronous块的东西。 你有唯一的asynchronous事件是setTimeout / setInterval / process.nextTick和任何asynchronousIO操作。

不应该手动进行asynchronous计算。 一个人应该避免做太多的计算。

我写了一篇关于非阻塞意味着什么的文章

Raynos大多是正确的。 但仅仅因为JavaScript是单线程的,并不意味着你可以让你的警卫失望。 你仍然需要知道线程。 一个很好的例子就是socket.io如何与不同的客户端保持连接,并且能够跟踪这些客户端。

JavaScript的函数式编程部分通过variables绑定来工作(比如…一个LOT)。 不知道线程会让你错误地认为你的variables是正确绑定的。 像socket.io的例子一样,你怎么能确定你所获得的连接是你认为的客户? 如果引用绑定出错而连接实际引用了不同的客户端呢?

这是你需要小心的事情。