N_R*_*N_R 43 c# asp.net multithreading ghostscript thread-safety
请忍受我的新手问题..
我试图使用ghostscript,ASP.NET和C#将PDF转换为PNG.但是,我还读到ghostscript不是线程安全的.所以我的问题是:
"ghostscript不是线程安全"究竟是什么意思?如果我在一个实时ASP.NET(aspx)Web应用程序中使用它,并且许多并发用户同时访问它,它会产生什么影响?
我还从另一个网站上读到了ghostscript ver的主要特征.8.63是多线程渲染.这是否意味着我们的线程安全问题现已解决?ghostscript线程现在安全吗?
我也正在评估来自PDFTron的PDF2Image,它应该是线程安全的.但每CPU许可证并不便宜.是否值得为"线程安全"和"不安全"支付额外的钱?
Eri*_*ert 37
每个人都同意的精确技术定义很难得出.
非正式地,"线程安全"仅仅意味着"从多线程调用时表现得相当好".从多个线程调用时,对象不会崩溃或产生疯狂的结果.
如果您打算进行涉及特定对象的多线程编程,实际上需要回答的问题是"对象期望的线程模型是什么?"
有许多不同的线程模型.例如,"自由线程"模型是"从任何线程做任何你想做的事情;对象将处理它." 这是最容易处理的模型,也是对象提供者最难提供的模型.
另一方面是"单线程"模型 - 必须从单个线程周期访问所有对象的所有实例.
然后在中间有一堆东西."单元线程"模型是"您可以在两个不同的线程上创建两个实例,但是用于创建实例的任何线程都是您必须始终用于调用该实例上的方法的线程".
"借用线程"模型是"您可以在两个不同的线程上调用一个实例,但是您有责任确保没有两个线程同时执行此操作".
等等.在尝试针对它编写线程代码之前,找出对象所期望的线程模型.
Wil*_*ler 22
例如,鉴于集合不是threasafe:
var myDic = new Dictionary<string, string>();
Run Code Online (Sandbox Code Playgroud)
在多线程环境中,这将抛出:
string s = null;
if (!myDic.TryGetValue("keyName", out s)) {
s = new string('#', 10);
myDic.Add("keyName", s);
}
Run Code Online (Sandbox Code Playgroud)
当一个线程正在尝试将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.
Run Code Online (Sandbox Code Playgroud)
然后突然,第二个线程试图获得相同的"keyName"键值将不必将其添加到字典中,因为第一个线程已经添加它.
简而言之,线程安全意味着一个对象支持同时被多个线程使用,或者将为您适当地锁定线程,而不必担心线程安全.
2.我不认为GhostScript的现在是线程安全的.它主要使用多个线程来执行其任务,因此这使得它可以提供更高的性能.
3.根据您的预算和要求,这可能是值得的.但是如果你围绕包装器构建,你可能只能在方便的地方锁定(),或者如果你自己不使用多线程,那么绝对不值得为线程安全付费.这仅表示如果您的应用程序使用多线程,那么您将不会遭受库不是线程安全的后果.除非你真的多线程,否则不值得为线程安全库付费.
小智 11
我是一个Ghostscript开发人员,不会重复关于线程安全的一般理论.
我们一直致力于让GS成为线程安全的,这样就可以在一个进程中使用gsapi_new_instance创建多个"实例",但我们还没有完成这个我们的满意度(包括我们的QA测试).
但是,图形库是线程安全的,多线程渲染依赖于此,允许我们生成多个线程以并行显示来自显示列表的波段.多线程渲染已经过大量的QA测试,并被许多商业许可证持有者用于提高多核CPU的性能.
你可以打赌,当我们最终支持多个GS实例时,我们会宣布.大多数想要从需要多个实例的应用程序中使用当前GS的人为每个实例生成单独的进程,因此GS不需要是线程安全的.GS可以运行由参数列表选项确定的作业,或者I/O可以通过管道进出流程以提供数据和收集输出.
Jud*_*ngo 10
1)这意味着如果您在多个线程之间共享相同的Ghostscript对象或字段,它将崩溃.例如:
private GhostScript someGSObject = new GhostScript();
...
// Uh oh, 2 threads using shared memory. This can crash!
thread1.Use(someGSObject);
thread2.Use(someGSObject);
Run Code Online (Sandbox Code Playgroud)
2)我不这么认为 - 多线程渲染表明GS在内部使用多个线程进行渲染.它没有解决GS从多线程使用不安全的问题.
3)那里有问题吗?
要使GhostScript线程安全,请确保一次只有一个线程正在访问它.你可以通过锁来做到这一点:
lock(someObject)
{
thread1.Use(someGSObject);
}
lock(someObject)
{
thread2.Use(someGSObject);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13836 次 |
| 最近记录: |