Tag: thread safety

使用CLR(和变体)将哪些CPU体系结构写入int“隐式易失性”?

我最近在这里学到以下是x86 CPU上的线程安全x86 CLR(不一定是ECMA标准CLR) public class SometimesThreadSafe { private int value; public int Value { get { return value; } } public void Update() { Interlocked.Add(ref value, 47); } } 这是因为在此类体系结构上写入int可确保同步任何其他CPU缓存。 但是在ARM CPU上,这不是线程安全的! 从另一个线程读取值可以读取CPU缓存中的旧副本。 所以问题在于CPU体系结构以及CLR的哪些版本及其变体(例如Mono)是否具有线程安全性?

跨多个HttpWebRequests使用相同的CookieContainer是否安全?

我正在做一种WebCrawler,我需要在请求之间保持Cookies状态。 我下载所有页面异步创建新的HttpWebRequest实例,但设置相同的CookieContainer。 页面可以写入和读取cookie。 我可以安全地做吗? 有没有任何替代方法不是CookieContainer的子类并在所有方法中放置锁? MSDN说这个类不是线程安全的,但在实践中,我能做到吗?

C#随机数生成器卡在一个循环中

我正在使用.NET创建一个人工生命程序,我正在使用C#在Singleton中定义的伪随机类。 我的想法是,如果我在整个应用程序中使用相同的随机数生成器,我只能保存种子,然后从种子重新加载以重新计算某个有趣的运行。 public sealed class RandomNumberGenerator : Random { private static readonly RandomNumberGenerator instance = new RandomNumberGenerator(); RandomNumberGenerator() { } public static RandomNumberGenerator Instance { get { return instance; } } } 我还想要一个可以给我两个不同随机数的方法。 public static Tuple TwoDifferentRandomNumbers(this Random rnd, int minValue, int maxValue) { if (minValue >= maxValue) throw new ArgumentOutOfRangeException(“maxValue”, “maxValue must be greater […]

如何使自定义线程安全通用列表返回C#中的整个列表?

我是一个线程菜鸟,我试图在C#(.NET 3.5 SP1)中编写一个自定义线程安全通用列表类。 我已经阅读了为什么线程安全集合如此困难? 。 在查看了课程的要求之后,我想我只需要安全地添加到列表中并返回列表。 该示例显示了我想要的所有内容,除了它缺少返回列表方法,因此我编写了自己的公共方法,如下所示: 更新:根据给出的建议,我已经审查了我的要求,因此将课程简化为如下: public sealed class ThreadSafeList { private readonly IList list = new List(); private readonly object lockable = new object(); public void Add(T t) { lock (lockable) { list.Add(t); } } public IList GetSnapshot() { IList result; lock (lockable) { result = new List(list); } return result; } […]

ASP.NET代码隐藏类中的静态方法是否是非线程安全的?

如果不使用任何实例成员,我可以在ASP.NET Pages和UserControls类中使用static方法吗? 即: protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e) { gridStatement.DataSource = CreateDataSource(); gridStatement.PageIndex = e.NewPageIndex; gridStatement.DataBind(); } private static DataTable CreateDataSource() { using (var command = new SqlCommand(“SELECT foobar”)) { var table = new DataTable(); new SqlDataAdapter(command).Fill(table); return table; } } 或者这不是线程安全的?

可以安全锁定和监控同一对象吗?

我有以下情况:我想mutualy排除对象的访问。 到目前为止,我通常会使用锁定对象 object lockObject = new object(); … method1: lock(lockObject) { CODE1 } 现在我还有一个可以从另一个线程调用的方法。 它不应该在未知的时间被阻止,而应该在规定的时间内给出答案。 在这种情况下,我会使用一个监视器,如 method2: try{ Monitor.TryEnter(lockObject , 20000, ref lockTaken); if (lockTaken) {CODE2} } catch(…){…} finally { if (lockTaken) Monitor.Exit(timerLock); } 现在我的问题是:如果lockobject是相同的并相互排斥,或者需要将每个锁更改为监视器,可以以这种方式锁定和监视混合。 那么两次相同的令牌都会被“锁定”,或者监视器会为对象创建另一个令牌然后锁定吗? 瞥见我看不到aplication同时在两个代码中运行。 但我不知道是否存在任何时序问题,其中CODE1和CODE2并行执行。

C#Singleton线程安全

我有一个类似于此的单例类 public class Singleton { private static Singleton m_instance; private Timer m_timer; private static List m_cacheObjects; private Singleton() { m_cacheObjects = new List(); m_timer= new Timer(MyTimerCallBack, null, TimeSpan.FromSeconds(60), TimeSpan.FromSeconds(60)); } public static Singleton Instance { get { if (m_instance == null) { m_instance = new Singleton(); } return m_instance; } } private void MyTimerCallBack(object state) […]

共享资源锁

我在.NET 4.5上使用C# – Web API Self Host。 服务器端我有一个非线程安全的进程:它可以一次处理一个请求。 如何在控制器代码中锁定此资源(进程),以便按顺序提供客户端,等待资源在使用之前被释放? 就像是: while(true){ if(!process.isLocked) break; } lock(process) do(work) unlock(process) warn(others) 任何代码段或建议都表示赞赏。 提前致谢。

如何在不锁定的情况下读取此实例原始线程安全?

下面的类的问题是当读取myThreadSafe.Value它可能不会返回最新的值。 public class ThreadSafe { private int value; public int Value { get { return value; } } public void Update() { Interlocked.Add(ref value, 47); // UPDATE: use interlocked to not distract from the question being asked. } } 我知道在阅读和写作时我可以锁定: public int Value { get { lock(locker) return value; } } public void Update() { […]

带线程的INotifyPropertyChanged

我有一个 BindingList 它绑定到datagridview。 我class上的一个属性需要很长时间来计算,所以我对操作进行了操作。 在计算之后,我引发OnPropertyChanged()事件以通知网格值已准备好。 至少,这就是理论。 但是由于OnPropertyChanged方法是从差异线程调用的,所以我在网格的OnRowPrePaint方法中得到了一些常见的exception。 任何人都可以告诉我如何在主线程中推出OnPropertyChanged事件吗? 我不能使用Form.Invoke,因为类MyClass不知道它在Winforms应用程序中运行。 public class MyClass : INotifyPropertyChanged { public int FastMember {get;set;} private int? slowMember; public SlowMember { get { if (slowMember.HasValue) return slowMember.Value; else { Thread t = new Thread(getSlowMember); t.Start(); return -1; } } } private void getSlowMember() { Thread.Sleep(1000); slowMember = 5; OnPropertyChanged(“SlowMember”); } public […]