Quais operações no nó são seguras para threads?

estou a usaressa abordagem para armazenar dados em uma matriz global que hospeda um servidor http, em que determinadas solicitações manipularão a matriz global.

Estou meio preocupado em encontrar problemas de encadeamento em certas operações - principalmentepush esplice. Eu imagino se uma solicitação me faz iterar sobre a matriz e remover itens com base em uma condicional, enquanto outra solicitação me chama.push() na matriz que vou encontrar problemas. alguém pode confirmar isso?

Eu escrevo principalmente em C #, onde até mesmo um incremento simples não é thread safe (lançando 25 threads que fazem i ++, não garante que eu == 25 depois de tudo dito e feito).

Atualizar:

Eu escrevi 5 exemplos para demonstrar o que estou falando. Teste 1 e Teste 3 funcionam bem. Teste 2 falha, por causa de bem ... o que normalmente seria chamado de problemas de threading (se eles são segmentos reais da CPU ou não). Os testes 4 e 5, quando executados em paralelo, parecem funcionar (o que significa que não têm problemas de colisão como o Teste 2).

http://pastebin.com/HcJHTDFY

Estou usando o ApacheBench para testar, fazendo 1000 solicitações paralelas.

Isso me leva a acreditar que o Teste 1 e o Teste 3 funcionam bem porque o nodejs não executará mais de 1instância doapp.get('/test3'...) retorno de chamada em paralelo função javascript em paralelo (bloqueio?). Assim que você implementa um setInterval / setTimeout, ele libera o nodejs para executar outra instância do callback (non-blocking?).

Eu estou realmente apenas tentando entender o que diabosnon-blocking I/O model realmente significa. Isso significa que "hey é possível fazer o não-bloqueio com setTimeout e setInterval se você precisar de não-bloqueio, senão vamos bloquear quaisquer outras funções de nível externo de serem executadas até esgotarmos a função em que estamos" ? Eu sinto que é imperativo saber isso para não me meter em problemas pensando que eu poderia implementar algo como / test2 e ser totalmente seguro.

Além disso, se eu estiver tentando não bloquear meus retornos de chamada, devo realmente ligarsetTimeout(code, 1)? Ou há uma maneira melhor?

questionAnswers(2)

yourAnswerToTheQuestion