Вы говорите, что не хотите использовать lock
по соображениям производительности, но проверяли ли вы его? Неоспоримая блокировка (которая, вероятно, будет, по звукам) довольно дешевая.
Я обычно говорю «очевидно правильно», а не «умно и, возможно, лучше работает», когда речь идет о многопоточности (и в целом, но особенно при многопоточности).
Оцените приложение с блокировкой и без нее и посмотрите, сможете ли вы заметить разницу. Если блокировка делает значительную разницу, то обязательно используйте хитрые вещи. В противном случае я бы просто придерживался замка.
Одна вещь, которую вы могли бы хотеть сделать, это использовать Interlocked.Increment
с int
и просто разыграть ее, когда необходимо, чтобы получить uint
, например:
using System;
using System.Reflection;
using System.Threading;
public class Test
{
private static int count = int.MaxValue-1;
public static uint IncrementCount()
{
int newValue = Interlocked.Increment(ref count);
return unchecked((uint) newValue);
}
public static void Main()
{
Console.WriteLine(IncrementCount());
Console.WriteLine(IncrementCount());
Console.WriteLine(IncrementCount());
}
}
Выход:
2147483647
2147483648
2147483649
(Другими словами, без проблем.)