"스레드 세이프"가 정말 의미하는 것은...실용적인 용어로
저의 초보적인 질문들을 참아주세요.
저는 고스트스크립트와 ASP를 사용하여 PDF를 PNG로 변환하려고 했습니다.NET 및 C#.하지만 고스트스크립트가 스레드 세이프가 아니라는 것도 읽었습니다.그래서 제 질문은 다음과 같습니다.
"고스트스크립트는 스레드 세이프가 아니다"는 실제적인 용어로 정확히 무엇을 의미합니까?실시간 ASP에서 사용하면 어떤 영향을 미칩니까?동시에 많은 동시 사용자가 액세스하는 NET(aspx) 웹 애플리케이션?
고스트스크립트 ver. 8.63의 주요 기능은 멀티스레드 렌더링이라는 것도 다른 사이트에서 읽었습니다.이것은 우리의 스레드 세이프 문제가 이제 해결되었다는 것을 의미합니까?이제 고스트스크립트 스레드는 안전합니까?
스레드 세이프로 되어 있는 PDFTron의 PDF2 Image도 검토 중입니다.그러나 CPU당 라이센스는 저렴하지 않습니다."스레드 세이프" 대 "안전하지 않은" 추가 비용을 지불할 가치가 있습니까?
모든 사람이 동의하는 정확한 기술적 정의는 생각해 내기 어렵습니다.
비공식적으로 "스레드 세이프"는 단순히 "여러 스레드에서 호출할 때 상당히 잘 작동됨"을 의미합니다.여러 스레드에서 호출할 때 개체가 충돌하거나 비정상적인 결과를 생성하지 않습니다.
특정 개체를 포함하는 멀티 스레드 프로그래밍을 수행하려면 실제로 답변을 받아야 하는 질문은 "개체가 예상하는 스레드 모델은 무엇입니까?"입니다.
다양한 스레드 모델이 있습니다.예를 들어, "자유 스레드" 모델은 "어떤 스레드에서도 원하는 것은 무엇이든 합니다. 객체가 처리할 것입니다."입니다.이 모델은 가장 다루기 쉽고 객체 공급자가 제공하기 어려운 모델입니다.
스펙트럼의 다른 쪽 끝에는 "단일 스레드" 모델이 있습니다. 모든 개체의 모든 인스턴스는 단일 스레드, 주기에서 액세스해야 합니다.
그리고 중간에 많은 것들이 있습니다."아파트 스레드" 모델은 "두 개의 서로 다른 스레드에 두 개의 인스턴스를 만들 수 있지만 인스턴스를 만들 때 사용하는 스레드는 해당 인스턴스에서 메서드를 호출할 때 항상 사용해야 하는 스레드입니다."입니다.
렌탈 스레드 모델은 "두 개의 서로 다른 스레드에서 하나의 인스턴스를 호출할 수 있지만 두 스레드가 동시에 호출되지 않도록 해야 합니다."입니다.
등등.개체에 대해 스레드 코드를 작성하기 전에 개체가 예상하는 스레드 모델을 확인합니다.
예를 들어 컬렉션이 안전하지 않다는 점을 고려하면 다음과 같습니다.
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에 추가하려고 시도하는 동안 다른 스레드가 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" 키 값을 가져오려는 두 번째 스레드가 첫 번째 스레드가 이미 추가한 것처럼 사전에 추가할 필요가 없습니다.
즉, 스레드 세이프는 객체가 여러 스레드에서 동시에 사용할 수 있도록 지원하거나 스레드 안전에 대한 걱정 없이 스레드를 적절하게 잠글 수 있음을 의미합니다.
나는 고스트스크립트가 이제 스레드 세이프라고 생각하지 않습니다.주로 여러 스레드를 사용하여 작업을 수행하므로 성능이 향상됩니다.
예산과 요구 사항에 따라 가치가 있을 수 있습니다.그러나 포장지를 중심으로 구축하는 경우에는 () 잠금이 편리한 곳에서만 가능하거나, 멀티스레딩을 직접 사용하지 않는 경우에는 스레드 안전성에 대한 비용을 지불할 가치가 없습니다.이는 응용 프로그램이 멀티스레딩을 사용하는 경우 라이브러리가 스레드 세이프되지 않는 결과를 초래하지 않는다는 것을 의미합니다.정말 멀티 스레드가 아닌 이상, 스레드 세이프 라이브러리에 대한 비용을 지불할 가치가 없습니다.
저는 고스트스크립트 개발자이며 스레드 안전에 대한 일반적인 이론을 반복하지 않을 것입니다.
단일 프로세스 내에서 gsapi_new_instance를 사용하여 여러 개의 'instance'를 생성할 수 있도록 GS가 스레드 세이프가 되도록 노력해 왔지만, 아직 만족스럽게 완료되지 않았습니다(이에 대한 QA 테스트 포함).
그러나 그래픽 라이브러리는 스레드 안전하며 다중 스레드 렌더링을 사용하면 디스플레이 목록에서 대역을 병렬로 렌더링하기 위해 여러 스레드를 생성할 수 있습니다.은 많은 을 향상시키기 합니다.
최종적으로 GS의 여러 인스턴스를 지원할 때 발표할 것입니다.여러 인스턴스가 필요한 애플리케이션의 현재 GS를 사용하려는 대부분의 사용자는 각 인스턴스에 대해 별도의 프로세스를 생성하여 GS가 스레드 안전할 필요가 없습니다.GS는 인수 목록 옵션에 따라 작업을 실행하거나 프로세스에서 I/O를 파이프로 연결하여 데이터를 제공하고 출력을 수집할 수 있습니다.
여러 스레드 간에 동일한 Ghostscript 개체 또는 필드를 공유하면 충돌합니다.예:
private GhostScript someGSObject = new GhostScript();
...
// Uh oh, 2 threads using shared memory. This can crash!
thread1.Use(someGSObject);
thread2.Use(someGSObject);
저는 그렇게 생각하지 않습니다. 멀티 스레드 렌더링은 GS가 내부적으로 여러 스레드를 사용하여 렌더링하고 있음을 시사합니다.그것은 GS가 여러 스레드에서 사용하기에 안전하지 않은 문제를 다루지 않습니다.
질문이 있나요?
GhostScript 스레드를 안전하게 만들려면 한 번에 하나의 스레드만 액세스해야 합니다.잠금을 통해 이 작업을 수행할 수 있습니다.
lock(someObject)
{
thread1.Use(someGSObject);
}
lock(someObject)
{
thread2.Use(someGSObject);
}
셸 개체의 ghostscript를 사용하는 경우(즉, 파일을 처리하기 위해 명령줄을 실행하는 경우), 실행 중인 모든 인스턴스가 서버에서 다른 프로세스를 수행하기 때문에 스레드화 문제에 걸리지 않습니다.주의해야 할 점은 PDF를 처리하기 위해 C#에서 사용하는 dll이 있는 경우 두 스레드가 동시에 동일한 코드를 실행하지 않도록 해당 코드를 동기화해야 한다는 것입니다.
스레드 세이프는 기본적으로 여러 스레드에 의해 액세스되는 경우에도 코드 조각이 올바르게 작동한다는 것을 의미합니다.스레드 응용 프로그램에서 비 스레드 안전 코드를 사용하는 경우 여러 문제가 발생할 수 있습니다.가장 일반적인 문제는 교착 상태입니다.그러나 스레드 문제는 디버깅하기 어렵기로 악명 높기 때문에 더 문제가 될 수 있는 훨씬 더 사악한 문제(레이스 조건)가 있습니다.
아니요. 멀티스레드 렌더링은 GS가 스레드를 사용하여 렌더링하기 때문에 더 빠르게 렌더링할 수 있다는 것을 의미합니다(이론적으로는 어쨌든 실제로는 항상 그렇지만은 않습니다).
이는 렌더러를 어떤 용도로 사용할 것인지에 따라 달라집니다.여러 스레드를 사용하여 응용 프로그램에 액세스하려는 경우 스레드가 안전한지 걱정해야 합니다.그렇지 않으면, 그것은 큰 문제가 아닙니다.
일반적으로 그것은 모호한 용어입니다.
스레드-안전은 공유 데이터를 올바르게 동기화하는 개념 수준일 수 있습니다.이것은 보통 도서관 작가들이 의미하는 것입니다.
때로는 동시성이 언어 수준에서 정의된다는 것을 의미합니다. 즉, 언어의 메모리 모델이 동시성을 지원합니다.이것은 까다롭군요! 왜냐하면 도서관 작성자는 동시 도서관을 만들 수 없기 때문입니다. 언어에는 사용해야 하는 많은 기본적인 기본 요소에 대한 보장이 없기 때문입니다.이것은 라이브러리 사용자보다 컴파일러 작성자와 더 관련이 있습니다.그런 의미에서 C#은 스레드 세이프입니다.
제가 당신의 질문에 직접 대답하지 않은 것은 알지만, 도움이 되기를 바랍니다.
언급URL : https://stackoverflow.com/questions/2412417/what-thread-safe-really-means-in-practical-terms
'programing' 카테고리의 다른 글
Pphmyadmin에 대한 사용자 입력이 있는 SQL 삽입 문이 작동하지 않습니다. (0) | 2023.08.30 |
---|---|
TSQL의 고유 제약 조건 열 목록을 가져오시겠습니까? (0) | 2023.08.30 |
ASP.NET MVC "Ajax.BeginForm"은 모델이 유효하지 않더라도 OnSuccess를 실행합니다. (0) | 2023.08.30 |
도커 구성에서 호스트 디렉토리를 볼륨으로 마운트하려면 어떻게 합니까? (0) | 2023.08.30 |
JWT: 'module' 개체에 'encode' 특성이 없습니다. (0) | 2023.08.30 |