Closed alkee-allm closed 4 years ago
RequestStream.WriteAsync
is not safe for multi-threading. Only one message can be written to a stream at a time. Sending messages from multiple threads over a single stream requires a producer/consumer queue like Channel\<T> to marshall messages.
별도의 queue(channel)까지 두기보다 간단히 user 수준(`user.Stream)의 lock 이면 되지 않을까? lock 중에는 같은 thread 에서 동작 해야하는 task 가 모두 지연이 될 수 있겠지만, 가장 간단한 수정으로 진행하고 추후에 문제가 있다면 추가 진행할 것.
문제
lock (responseStream) //
{
await responseStream.WriteAsync(new PushResponse
{
Type = PushResponse.Types.PushType.Config,
Message = "jwt",
Extra = newJwt
});
}
와 같이 사용하면 CS1996: lock 문의 본문에서 await를 사용할 수 없습니다. 빌드 오류. lock 이 걸려있는 상태에서는 Task 중(다른 thread) deadlock 이 발생하기 쉽기 때문일 것. 역시 producer/consumer queue 를 사용해야할까..
예시
RequestStream.WriteAsync
함수가 thread-safe 하지 않기 때문에, backend 로부터 전달받은 push request 가 thread-safe 하지 않을 수 있다.따라서, 이를 확인하고 수정이 필요하다.