Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

race condition #6

Open
crgimenes opened this issue Mar 7, 2017 · 3 comments
Open

race condition #6

crgimenes opened this issue Mar 7, 2017 · 3 comments

Comments

@crgimenes
Copy link
Collaborator

Possível race condition no SpedRead.go

https://github.com/chapzin/parse-efd-fiscal/blob/master/SpedRead/SpedRead.go#L57
Precisamos ver a melhor forma de limitar goroutines, da forma que estamos fazendo hoje pode causar uma race condition, poderíamos simplesmente usar mutex e resolver esse caso rapidamente mas também podemos reescrever esse limitador usando canais.

@danielfireman
Copy link

danielfireman commented Oct 5, 2017

disclaimer .. apenas dei uma lida no código para tentar dar uma ajuda aqui.

Um possível problema que pode acontecer é o wait() terminar antes dessa go routine terminar. Como vocês passam um apontador para a variável r, na próxima iteração esse ponteiro pode ser modificado, causando algum tipo de corrupção.

Em resumo, talvez o fix para essa race condition seja tão simples tão simples quanto passar a variável r por valor aqui. Claro que envolve uma mudança na função InsertSped.

@crgimenes
Copy link
Collaborator Author

Nesse caso não tem como acontecer porque o decremento da variável id acontece no fim da InsertSped, o problema de data race eu explico como corrigir aqui: http://crg.eti.br/post/go-previnindo-data-race/ achei que o @chapzin tinha feito no sistema dele também.

@danielfireman
Copy link

Opa @crgimenes, obrigado pela explicação. Entendi sim e parabéns pelo post!

Realmente a quantidade de ferramentas desse tipo em go é bem grande. Só acrescentando um pouca, outra forma de atingir o mesmo objetivo (com performance similar) do exemplo do post é usando o pacote sync/atomic.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants