このコードがこのコードのスレッドセーフであるかどうかを知りたいですか?参照型はスレッドセーフですが、このケースでは一般的なので、私たちは正しいことができないので、私はそう思うでしょうか?コードはスレッドセーフですか?
public class LifoMsgQueue<T>
{
private class Node<E>
{
internal Node<E> next;
internal E msg;
internal Node(E msg)
{
this.msg = msg;
}
}
private Node<T> top;
public void Send(T msg)
{
Node<T> node = new Node<T>(msg);
node.next = top;
top = node;
}
public T Receive()
{
SpinWait sw = new SpinWait();
Node<T> oldTop;
while ((oldTop = top) == null)
sw.SpinOnce();
top = oldTop.next;
return oldTop.msg;
}
}
"参照型はスレッドセーフです"! – user2864740
2つのスレッドが同時に 'Send'を呼び出すと、それはすべて終わりです。 –
同期が表示されていない場合、このコードはスレッドセーフではありません。ローカルの 'SpinWait sw'変数を使用すると、同期としてカウントされません。 –