Wpis z mikrobloga

#programowanie #csharp

Pytanie nieco bardziej zaawansowane.

Czy jest możliwe aby użycie wielu producerów i consumerów przy BlockingCollection wywołało deadlock w jakiś sposób?

Każdy consumer używa GetConsumingEnumerable w pętli foreach, nie ma tam żadnych locków ani innych pierdół, które mogłyby coś blokować. A jednak zdarzają się sytuacje, gdzie wychodziłoby że zdarzył się deadlock. I to jakby tego było mało wygląda jakby stało się to przy zapisie gdzieś na samym początku, bo consumerzy w logach jeszcze się wtedy nie obudzili (albo wywaliło na samym początku w consumerach przy próbie pobrania iteratora).
  • 6
@zibizz1: To raczej mało prawdopodobne bo siedzą w Task.Run. Natomiast można dodać ewentualnie do logów ThreadId jakiś, żeby w przyszłości mieć pewność że tak się nie zdarzyło.
@Khaine: A dużo tego masz?
Bo czasem jest tak że puszczasz 100 Tasków a tylko 2,4,8 moga się wykonywac jednocześnie. Jesli najpierw puszczasz consumerów to może zajmuja oni sloty i zajmują dostępne watki z poola aktywnie czekając i producer nie może sie wbić do threadpoola, i wszystko wisi.