Учитывая, что коллекция, например, не является безопасной:
var myDic = new Dictionary<string, string>();
В многопоточной среде это вызовет:
string s = null;
if (!myDic.TryGetValue("keyName", out s)) {
s = new string('#', 10);
myDic.Add("keyName", s);
}
Поскольку один поток работает, пытаясь добавить KeyValuePair в словарь myDic, другой может попробовать GetGetValue (). Поскольку коллекции не могут быть прочитаны и записаны одновременно, возникнет исключение.
Однако, с другой стороны, если вы попробуете это:
// Other threads will wait here until the variable myDic gets unlocked from the preceding thread that has locked it.
lock (myDic) {
string s = null;
if (!myDic.TryGetValue("keyName", out s)) {
s = new string('#', 10);
myDic.Add("keyName", s);
}
} // The first thread that locked the myDic variable will now release the lock so that other threads will be able to work with the variable.
Затем внезапно второй поток, пытающийся получить то же значение ключа «keyName», не должен будет добавлять его в словарь, поскольку первый поток уже добавил его.
Короче говоря, потокобезопасность означает, что объект поддерживает одновременное использование несколькими потоками или будет блокировать потоки соответствующим образом, без необходимости беспокоиться о безопасности потоков.
2. Я не думаю, что GhostScript теперь безопасен для потоков. Для выполнения своих задач он в основном использует несколько потоков, поэтому это обеспечивает более высокую производительность, вот и все.
3. В зависимости от вашего бюджета и ваших потребностей, он может быть достойным. Но если вы создаете оболочку, возможно, вы можете использовать lock () только там, где это удобно, или если вы не используете многопоточность самостоятельно, определенно не стоит платить за безопасность потоков. Это означает только то, что если ВАШЕ приложение использует многопоточность, то вы не пострадаете от последствий того, что библиотека не будет поточно-ориентированной. Если вы не пользуетесь многопоточностью, платить за многопотоковую библиотеку не стоит.