我想为实验创建一个非线程安全的代码块,这些是2个线程要调用的函数.
c = 0
def increment():
c += 1
def decrement():
c -= 1
Run Code Online (Sandbox Code Playgroud)
这段代码线程安全吗?
如果没有,我可以理解为什么它不是线程安全的,以及什么样的语句通常会导致非线程安全的操作.
如果它是线程安全的,我怎样才能使它明确地是非线程安全的?
请忍受我的新手问题..
我试图使用ghostscript,ASP.NET和C#将PDF转换为PNG.但是,我还读到ghostscript不是线程安全的.所以我的问题是:
"ghostscript不是线程安全"究竟是什么意思?如果我在一个实时ASP.NET(aspx)Web应用程序中使用它,并且许多并发用户同时访问它,它会产生什么影响?
我还从另一个网站上读到了ghostscript ver的主要特征.8.63是多线程渲染.这是否意味着我们的线程安全问题现已解决?ghostscript线程现在安全吗?
我也正在评估来自PDFTron的PDF2Image,它应该是线程安全的.但每CPU许可证并不便宜.是否值得为"线程安全"和"不安全"支付额外的钱?
可以说我有一个结构:
struct Foo {
char a; // read and written to by thread 1 only
char b; // read and written to by thread 2 only
};
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当两个线程在两个不同的内存位置上运行时,C++标准保证了上述的安全性.
我想尽管如此,因为char a和char b属于同一个缓存行,所以编译器必须进行额外的同步.
这到底发生了什么?
我有一个webapp,我正在进行一些负载/性能测试,特别是在我们希望有几百个用户访问同一页面并在此页面上每10秒点击一次刷新的功能.我们发现我们可以使用此功能进行改进的一个方面是在一段时间内缓存来自Web服务的响应,因为数据没有变化.
在实现这个基本缓存之后,在一些进一步的测试中,我发现我没有考虑并发线程如何同时访问Cache.我发现在大约100毫秒内,大约有50个线程试图从缓存中获取对象,发现它已经过期,命中Web服务以获取数据,然后将对象放回缓存中.
原始代码看起来像这样:
private SomeData[] getSomeDataByEmail(WebServiceInterface service, String email) {
final String key = "Data-" + email;
SomeData[] data = (SomeData[]) StaticCache.get(key);
if (data == null) {
data = service.getSomeDataForEmail(email);
StaticCache.set(key, data, CACHE_TIME);
}
else {
logger.debug("getSomeDataForEmail: using cached object");
}
return data;
}
Run Code Online (Sandbox Code Playgroud)
因此,为了确保在对象key过期时只有一个线程正在调用Web服务,我认为我需要同步Cache get/set操作,并且似乎使用缓存键是一个很好的候选对象同步(这样,对电子邮件b@b.com的此方法的调用不会被方法调用a@a.com阻止).
我将方法更新为如下所示:
private SomeData[] getSomeDataByEmail(WebServiceInterface service, String email) {
SomeData[] data = null;
final String key = "Data-" + email;
synchronized(key) {
data =(SomeData[]) StaticCache.get(key);
if (data == null) {
data = service.getSomeDataForEmail(email); …Run Code Online (Sandbox Code Playgroud) java multithreading synchronization synchronized thread-safety
从以下网站:
http://crfdesign.net/programming/top-10-differences-between-java-and-c
不幸的是,
List<>它不是线程安全的(C#ArrayList和JavaVector是线程安全的).C#也有一个Hashtable; 通用版本是:
什么使List<T>线程不安全?它是.NET框架工程师的实现问题吗?或者泛型不是线程安全的吗?
我有一个多线程程序,我创建一个生成器函数,然后将其传递给新线程.我希望它在本质上是共享/全局的,因此每个线程都可以从生成器获取下一个值.
使用这样的生成器是安全的,还是会遇到从多个线程访问共享生成器的问题/条件?
如果没有,是否有更好的方法来解决问题?我需要一些循环遍历列表的东西,并为任何线程调用它生成下一个值.
有哪些推荐的方法可以实现线程安全的延迟初始化?例如,
// Not thread-safe
public Foo getInstance(){
if(INSTANCE == null){
INSTANCE = new Foo();
}
return INSTANCE;
}
Run Code Online (Sandbox Code Playgroud) 据称Python的流行Requests库在其主页上是线程安全的,但没有给出进一步的细节.如果我调用requests.session(),我可以安全地将此对象传递给多个线程,如下所示:
session = requests.session()
for i in xrange(thread_count):
threading.Thread(
target=target,
args=(session,),
kwargs={}
)
Run Code Online (Sandbox Code Playgroud)
并在多个线程中使用相同的连接池发出请求?
如果是这样,这是推荐的方法,还是应该为每个线程提供自己的连接池?(假设所有单个连接池的总大小总计为一个大连接池的大小,如上所述.)每种方法的优缺点是什么?
只是检查...... _count正在安全访问,对吗?
两个方法都由多个线程访问.
private int _count;
public void CheckForWork() {
if (_count >= MAXIMUM) return;
Interlocked.Increment(ref _count);
Task t = Task.Run(() => Work());
t.ContinueWith(CompletedWorkHandler);
}
public void CompletedWorkHandler(Task completedTask) {
Interlocked.Decrement(ref _count);
// Handle errors, etc...
}
Run Code Online (Sandbox Code Playgroud) thread-safety ×10
python ×3
c# ×2
c++ ×2
java ×2
.net ×1
asp.net ×1
c++11 ×1
generator ×1
generics ×1
ghostscript ×1
increment ×1
interlocked ×1
synchronized ×1