我有以下代码:
public const int ThreadLimitMax = 128;
private static object setThreadLimitLock = new object();
private static SemaphoreSlim totalThreadLimiter = new SemaphoreSlim(ThreadLimit, ThreadLimitMax);
public static int ThreadLimit { get; private set; } = 128;
public static async Task SetThreadLimit(int max)
{
if (max > ThreadLimitMax)
throw new ArgumentOutOfRangeException(nameof(max), $"Cannot have more than {ThreadLimitMax} threads.");
if (max < 1)
throw new ArgumentOutOfRangeException(nameof(max), $"Cannot have less than 1 threads.");
lock (setThreadLimitLock)
{
int difference = Math.Abs(ThreadLimit - max);
if (max < ThreadLimit)
{ …
Run Code Online (Sandbox Code Playgroud) 声明PublishSubject在RxJava中不是线程安全的.好.
我试图找到任何一个例子,我试图构建任何一个例子来模拟竞争条件,这会导致不必要的结果.但我不能:(
任何人都可以提供一个证明PublishSubject不是线程安全的例子吗?
我需要将 AtomicInteger 增加两次,例如:++i; ++i; 通过无尽的循环,我想将计数器增加两次并检查奇偶校验。但我总是得到增加一次的变量。如何解决?
在多线程环境中,锁定对线程敏感的资源很重要。我经常假设集合等是线程不安全的,具体取决于 MS 文档,但简单类型是否也是线程敏感的?
让我们举个例子。锁定 int 属性访问是否有用,例如
public int SomeProperty
{
get
{
lock (_lock)
{
return _value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者是一个足够普通的吸气剂,即
public int SomeProperty => _value;
Run Code Online (Sandbox Code Playgroud)
据我了解,一个简单的字段读取是线程安全的,但我仍然在网上和一些代码库中看到第一个例子。
第二个问题,单行指令中的值是顺序读取还是同时读取?换句话说,我这样做时是否需要锁定
public TimeSpan GetSomeExampleValue()
{
lock (_lock)
{
return _dateTime1 - _dateTime2;
}
}
Run Code Online (Sandbox Code Playgroud)
或者我可以简单地做
public TimeSpan GetSomeExampleValue()
{
return _dateTime1 - _dateTime2;
}
Run Code Online (Sandbox Code Playgroud) c# multithreading locking thread-safety thread-synchronization
回到我原来的非托管c ++时代,我可以信任多线程应用程序中的关键部分.所以,现在使用dotNet/C#,我正在转发锁定机制.通过锁定资源,我确信任何线程都无法在我的代码段中访问这些资源.
这在dotNet中似乎不是真的!
我有我的Windows服务应用程序.我创建了一个主托管线程,其中隐藏的表单托管了第三个奇偶校验OCX.在这个线程中,我做消息在一个对象列表上进行轮询.此管理线程中的OCX触发的事件会修改此对象列表.
我在这里发布了我的代码的简化部分:
public bool Start()
{
ServiceIsRunning = true;
m_TaskThread = new Thread(new ParameterizedThreadStart(TaskLoop));
m_TaskThread.SetApartmentState(ApartmentState.STA);
m_TaskThread.Start(this);
return true;
}
private void OnOCXEvent(object objToAdd)
{
lock(m_ObjectList)
{
m_ObjectList.Add(objToAdd); }
}
}
private void CheckList()
{
lock(m_ObjectList)
{
foreach(object obj in m_ObjectList)
{
...
}
}
}
[STAThread] // OCX requirement!
private void TaskLoop(object startParam)
{
try {
...
while (ServiceIsRunning)
{
// Message pump
Application.DoEvents();
if (checkTimeout.IsElapsed(true))
{
CheckList();
}
// Relax process CPU time!
Thread.Sleep(10);
}
} …
Run Code Online (Sandbox Code Playgroud)