这两种方法Thread.Suspend()和Thread.Resume()是因为.NET 2.0过时.为什么?什么是其他替代品和任何例子?
C++中是否存在线程安全的非阻塞队列类?
可能是一个基本问题,但我很长一段时间没有做过C++ ......
编辑:删除STL要求.
我知道,之前的几个问题/答案已经很明确了,这volatile与c ++内存模型的可见状态有关,而与多线程无关.
另一方面,Alexandrescu的这篇文章使用volatile关键字not作为运行时特性,而是使用编译时检查来强制编译器无法接受可能不是线程安全的代码.在文章中,关键字的使用更像是required_thread_safety标签,而不是实际的预期用途volatile.
这(ab)使用volatile合适吗?方法中可能隐藏了哪些可能的陷阱?
首先想到的是增加了混乱:volatile与线程安全无关,但由于缺乏更好的工具,我可以接受它.
文章的基本简化:
如果声明一个变量volatile,则只能volatile在其上调用成员方法,因此编译器将阻止调用其他方法的代码.声明std::vector实例volatile将阻止该类的所有使用.添加一个执行const_cast释放volatile需求的锁定指针形状的包装器,将允许通过锁定指针进行任何访问.
窃取文章:
template <typename T>
class LockingPtr {
public:
// Constructors/destructors
LockingPtr(volatile T& obj, Mutex& mtx)
: pObj_(const_cast<T*>(&obj)), pMtx_(&mtx)
{ mtx.Lock(); }
~LockingPtr() { pMtx_->Unlock(); }
// Pointer behavior
T& operator*() { return *pObj_; }
T* operator->() { return pObj_; }
private:
T* pObj_;
Mutex* pMtx_;
LockingPtr(const LockingPtr&); …Run Code Online (Sandbox Code Playgroud) 什么是使C#字典访问线程安全的最简单方法?最好只使用锁(对象),但欢迎任何其他想法!
在MSDN中,一些.NET类描述如下:
" 这种类型是线程安全的. "
要么
" 此类型的公共静态(在Visual Basic中为Shared)成员是线程安全的.实例成员不保证是线程安全的."
我的问题是哪些功能使一个类是线程安全的?
线程安全编程是否有任何标准,建议或指南?
当我使用lock(C#)关键字时,这意味着我的类是否是线程安全的?
如何评估一个类的线程安全性?是否有任何测试可以确保一个类是100%线程安全的?
例:
public class MyClass
{
public void Method()
{
lock (this)
{
// Now, is my class 100% thread-safe like Microsoft classes?
}
}
type m_member1;
type m_member2;
}
Run Code Online (Sandbox Code Playgroud)
谢谢
那里的任何人都可以帮助我理解线性化是什么吗?我需要一个简单易懂的解释.我正在阅读Maruice Herilihy和Nir Shavit 的"多处理器编程艺术",并试图理解第3章"并发对象".
我知道一个方法是可线性化的,如果它有一个点,它似乎从其他线程的角度瞬间"生效".这是有道理的,但也有人说,线性化实际上是执行历史的一个属性.执行历史是可线性化的,为什么我关心它,以及它与可线性化的方法或对象有什么关系?
谢谢!
parallel-processing concurrency multithreading thread-safety
Daniel在他的回答中指出(除非我读错了)ECMA-335 CLI规范允许编译器生成抛出NullReferenceException以下DoCallback方法的代码.
class MyClass {
private Action _Callback;
public Action Callback {
get { return _Callback; }
set { _Callback = value; }
}
public void DoCallback() {
Action local;
local = Callback;
if (local == null)
local = new Action(() => { });
local();
}
}
Run Code Online (Sandbox Code Playgroud)
他说,为了保证NullReferenceException不抛出,volatile关键字应该用于_Callback或lock应该在线周围使用local = Callback;.
有人可以证实这一点吗?而且,如果确实如此,Mono和.NET编译器之间在这个问题上的行为是否存在差异?
编辑
这是标准的链接. …
我有一类线程安全的公共代码.
该类中的一个方法是抽象的,需要为不同的实现重写.
我需要确保或至少向其他开发人员标记此方法的所有实现都需要是线程安全的.
做这个的最好方式是什么?
这个效果有关键字或注释吗?
我已经尝试过,abstract synchronized但不允许使用关键字组合.
正如许多人已经注意到并遇到的那样,HashMap.put当同时使用时可以进入无限执行循环(参见GRIZZLY-1207,JGRP-525,可能是HHH-6414,以及这个SO 答案).
HashMap清楚地记录为不是线程安全的.显然,正确的解决方法是使用一个线程安全的实现Map,ConncurrentHashMap尤其如此.我对导致无限循环的并发时序更加好奇.我最近使用Java 7 JRE遇到了这个循环,并想了解确切的原因.例如,这是由同时多次看跌引起的吗?
在HashMap.put中查看显示HashMap.Entry包含指向下一个节点的链接(在存储桶中?).我假设这些链接正在腐蚀以包含循环引用,这导致无限循环.但是,我仍然不明白腐败是如何发生的.
我在项目中面对以下代码:
synchronized (Thread.currentThread()){
//some code
}
Run Code Online (Sandbox Code Playgroud)
我不明白使用synchronized的原因currentThread.
两者之间有什么区别吗?
synchronized (Thread.currentThread()){
//some code
}
Run Code Online (Sandbox Code Playgroud)
只是
//some code
Run Code Online (Sandbox Code Playgroud)
你能提供一个显示差异的例子吗?
更详细的代码如下:
synchronized (Thread.currentThread()) {
Thread.currentThread().wait(timeInterval);
}
Run Code Online (Sandbox Code Playgroud)
看起来就像Thread.sleep(timeInterval).这是真的吗?
java concurrency multithreading synchronization thread-safety
thread-safety ×10
c# ×4
concurrency ×3
java ×3
.net ×2
c++ ×2
.net-2.0 ×1
class ×1
dictionary ×1
hashmap ×1
il ×1
synchronize ×1
volatile ×1