Подтвердить что ты не робот

Что "потокобезопасность" действительно означает... Практически

пожалуйста, примите мои вопросы о новичках.

Я пытался конвертировать PDF в PNG, используя ghostscript, с ASP.NET и С#. Тем не менее, я также прочитал, что ghostscript не является потокобезопасным. Поэтому мои вопросы:

  • Что именно означает "ghostscript не является потокобезопасным" означает на практике? Какое влияние это имеет, если я использую его в реальном веб-приложении ASP.NET(aspx) с одновременным доступом к нему одновременно одновременно?

  • Я также читал с другого сайта, что главная особенность ghostscript ver. 8.63 - многопоточный рендеринг. Означает ли это, что проблема с потоковой безопасностью теперь решена? Является ли ghostscript потоком безопасным сейчас?

  • Я также оцениваю PDF2Image из PDFTron, который должен быть потокобезопасным. Но лицензия на процессор не дешевая. Стоит ли платить дополнительные деньги за "потокобезопасность" против "небезопасно"?

4b9b3361

Ответ 1

Учитывая, что коллекция, например, не является безопасным:

var myDic = new Dictionary<string, string>();

В среде multhread это будет бросать:

string s = null;
if (!myDic.TryGetValue("keyName", out s)) {
    s = new string('#', 10);
    myDic.Add("keyName", s);
}

Как работает один поток, пытающийся добавить KeyValuePair в словарь myDic, другой может TryGetValue(). Поскольку сборники не могут быть прочитаны и записаны одновременно, произойдет Исключение.

Однако, с другой стороны, если вы попробуете это:

// 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. В зависимости от вашего бюджета и ваших требований он может быть достоин. Но если вы создадите вокруг обертки, вы, возможно, только заблокируете(), где это удобно, или если вы не используете многопоточность самостоятельно, то определенно не стоит платить за потоки. Это означает, что если ваше приложение использует многопоточность, то вы не будете страдать от последствий того, что библиотека не является потокобезопасной. Если вы действительно многопользовательские, это не стоит платить за потокобезопасную библиотеку.

Ответ 2

Точное техническое определение, на которое все согласны, трудно найти.

Неформально "потокобезопасность" означает просто "разумно хорошо себя вести при вызове из нескольких потоков". Объект не будет разбиваться или создавать сумасшедшие результаты при вызове из нескольких потоков.

Вопрос, на который вам действительно нужно получить ответ, если вы собираетесь выполнять многопоточное программирование, включающее конкретный объект, - это "какая модель потоковой передачи, ожидаемая объектом?"

Существует множество различных моделей потоков. Например, модель с "свободной резьбой" - "делать все, что угодно, от любого потока, объект будет иметь дело с ним". Это самая простая модель, с которой вам приходится иметь дело, и самый сложный для поставщика объектов.

На другом конце спектра используется "однопоточная" модель - все экземпляры всех объектов должны быть доступны из одного потока, периода.

А потом там куча вещей посередине. Модель "квартира с резьбой" - "вы можете создать два экземпляра на двух разных потоках, но любой поток, который вы используете для создания экземпляра, - это поток, который вы всегда должны использовать для вызова методов в этом экземпляре".

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

И так далее. Узнайте, какая модель потоков, которую ожидает ваш объект, прежде чем пытаться написать код потока с ней.

Ответ 3

1) Это означает, что если вы разделяете одни и те же объекты или поля Ghostscript из нескольких потоков, это приведет к сбою. Например:

private GhostScript someGSObject = new GhostScript();
...
// Uh oh, 2 threads using shared memory. This can crash!
thread1.Use(someGSObject);
thread2.Use(someGSObject);

2) Я так не думаю - многопоточный рендеринг предполагает, что GS внутренне использует несколько потоков для рендеринга. В нем не рассматривается проблема GS, которая небезопасна для использования из нескольких потоков.

3) Есть ли там вопрос?

Чтобы поток потоков GhostScript был безопасным, убедитесь, что к нему обращается только по одному потоку. Вы можете сделать это через блокировки:

lock(someObject)
{
   thread1.Use(someGSObject);
}
lock(someObject)
{
   thread2.Use(someGSObject);
}

Ответ 4

Я разработчик Ghostscript и не буду повторять общую теорию о безопасности потоков.
Мы работаем над тем, чтобы GS быть потокобезопасным, чтобы можно было создать несколько" экземпляров "с помощью gsapi_new_instance изнутри единый процесс, но мы еще не дополнили это до нашего удовлетворения (что включает в себя наше тестирование QA этого).




























несколько потоков, чтобы отображать полосы из списка отображения параллельно. Многопоточный рендеринг подвергся большому тестированию QA и используется многими коммерческими лицензиатами для повышения производительности многоядерных процессоров.

Вы можете поспорить, что мы объявим, когда мы, наконец, поддержим несколько экземпляров GS. Большинство людей, которые хотят использовать текущие GS из приложений, которые нуждаются в нескольких экземплярах, запускают отдельные процессы для каждого экземпляра, чтобы GS не нуждался в потокобезопасности. GS может выполнять задание, определяемое параметрами списка аргументов, или ввод/вывод может быть передан в/из процесса для предоставления данных и сбора данных.

Ответ 5

Если вы используете ghostscript из объекта оболочки (т.е. запустили командную строку для обработки файла), вы не поймаете проблемы с потоками, потому что каждый запущенный экземпляр будет работать в другом процессе на сервере. Если вам нужно быть осторожным, когда у вас есть dll, который вы используете с С# для обработки PDF-кода, этот код нужно синхронизировать, чтобы одновременно выполнять один и тот же код из двух потоков.

Ответ 6

  • Потоковый сейф в основном означает, что кусок кода будет функционировать корректно даже при доступе к нескольким потокам. При использовании безопасного потока в потоковом приложении может возникнуть несколько проблем. Наиболее распространенной проблемой является взаимоблокировка. Тем не менее, есть гораздо более гнусные проблемы (условия гонки), которые могут быть более проблематичными, потому что проблемы с резьбой, как правило, трудно отлаживать.

  • Нет. Многопоточный рендеринг просто означает, что GS будет иметь возможность отображать быстрее, потому что он использует потоки для рендеринга (теоретически, во всяком случае, не всегда верно на практике).

  • Это действительно зависит от того, для чего вы хотите использовать средство визуализации. Если вы собираетесь получать доступ к своему приложению с несколькими потоками, то да, вам нужно будет беспокоиться о том, что он является потокобезопасным. В противном случае это не имеет большого значения.

Ответ 7

В общем случае это двусмысленный термин.

Thread-Safety может быть на концептуальном уровне, где у вас есть правильная синхронизация ваших общих данных. Как правило, это означает, что библиотекаторы.

Иногда это означает, что concurrency определен на уровне языка. т.е. модель памяти языка поддерживает concurrency. Это сложно! потому что в качестве писателя библиотеки вы не можете создавать параллельные библиотеки, потому что язык не имеет гарантий для многих важных примитивов, которые необходимы для использования. Это касается писателей компилятора больше, чем пользователей библиотеки. В этом смысле С# является потокобезопасным.

Я знаю, что я не ответил на ваш вопрос напрямую, но надеюсь, что это поможет.