Как я могу иметь много потоков, которым нужно знать следующий идентификатор для обработки, а затем безопасно увеличить это число? - PullRequest
0 голосов
/ 10 сентября 2009

Я работаю в программе, которая будет обрабатывать данные несколькими потоками.

Каждый поток должен получить следующий доступный идентификатор, увеличить этот идентификатор на 1 для следующего потока и сделать это безопасным для потока способом.

Это тот случай, когда я бы использовал мьютекс? Должен ли я вместо этого использовать Queue.Synchronized и заполнить его всеми 300 000 идентификаторов или это не нужно?

Должен ли я иметь единственное целое число и каким-то образом заблокировать извлечение и обновление этого числа, чтобы поток1 пришел, получил «20» в качестве следующего идентификатора и затем увеличил его до «21», пока другой поток ожидает?

Какова наилучшая практика для этого варианта использования?

Ответы [ 4 ]

4 голосов
/ 10 сентября 2009

Вы можете сделать это без блокировки через Interlocked.Increment .

Просто сделайте это так:

private static int value;
public static int Value
{
    get { return Interlocked.Increment(ref value); }
}

Это всегда будет возвращать возрастающее целое число, без блокировок и с идеальной безопасностью потоков.

2 голосов
/ 10 сентября 2009

Это, вероятно, идеальный кандидат для Interlocked.Increment .

int id = 0;

int nextId = Interlocked.Increment(ref id); // returns the incremented value

Increment выполняется как элементарная операция и является поточно-ориентированным.

1 голос
/ 10 сентября 2009

Вы должны заглянуть в Класс блокировки . Он обеспечивает функциональность для атомарного увеличения значения целого числа.

1 голос
/ 10 сентября 2009

Нет.

Лучший способ сделать это - Interlocked.Increment ().

По сути, вы можете выполнить приращение потокобезопасным способом без блокировки на основе гарантий, предоставляемых архитектурой ЦП.

...