Я использую ConcurrentDictionary
(ongoingConnectionDic
) в своем коде:
- Я проверяю, существует ли номер последовательного порта в словаре.
- Если не существует, я добавляю его в словарь.
- Я выполняю связь с последовательным портом.
- Я удаляю элемент из
ongoingConnectionDic
. - Если существует, я помещаю поток в ожидание.
Мой вопрос: могу ли я гарантировать, что при выполнении операции чтения никакой другой поток одновременно не записывает/не обновляет значение? Итак, читаю ли я самое последнее значение словаря?
Если нет, то как мне достичь того, чего я хочу?
Пример программы:
class Program
{
// Dictionary in question
private static ConcurrentDictionary<string, string> ongoingPrinterJobs =
new ConcurrentDictionary<string, string>();
private static void sendPrint(string printerName)
{
if (ongoingPrinterJobs.ContainsKey(printerName))
{
// Add to pending list and run a thread to finish pending jobs by calling print();
}
else
{
ongoingPrinterJobs.TryAdd(printerName, ""); // -- Add it to the dictionary so that no other thread can
// use the printer
ThreadPool.QueueUserWorkItem(new WaitCallback(print), printerName);
}
}
private static void print(object stateInfo)
{
string printerName = (stateInfo as string);
string dummy;
// do printing work
// Remove from dictionary
ongoingPrinterJobs.TryRemove(printerName, out dummy);
}
static void Main(string[] args)
{
// Run threads here in random to print something on different printers
// Sample run with 10 printers
Random r = new Random();
for ( int i = 0 ; i < 10 ; i++ )
{
sendPrint(r.Next(0, 10).ToString());
}
}
lock
по каждому методу собственной реализацииIDictionary<K, V>
. - person Enigmativity   schedule 22.02.2016ConcurrentDictionary
, это то, что вы можете использовать его одновременно, не повреждая объект. Это необязательно означает, что ваше использование будет потокобезопасным. И на самом деле, в небольшом фрагменте кода, который вы разместили здесь, это не выглядит безопасным: если предположить, что несколько потоков, то, если один из них только что проверилContainsKey()
, он может быть вытеснен, а затем другой поток может выполнить ту же проверку, а затем написать к словарю. Теперь первый поток считает, что ключ не существует, и сделает что-то не так. - person Peter Duniho   schedule 22.02.2016