标签: thread-safety

在 Go 中使用 map 时忽略 goroutine/thread-safety 的危险是什么?

map据说Go不是goroutine-safe(见这里这里)。我有兴趣找出在我忽略使用互斥锁/等保护对地图的访问的情况下会发生什么。

具体来说,是否会发生以下任何一种情况?

  1. 假设我有一个带有键k1, k2, ...,的映射,当我请求(i != j)时kn,并发问题会导致 get吗?map[ki]map[kj]
  2. 它会导致panic应用程序中的 a 吗?

multithreading thread-safety go

-1
推荐指数
1
解决办法
879
查看次数

无法在锁中等待,如何确保不会从多个线程访问异步变量和方法?

我有以下代码:

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)

c# multithreading semaphore locking thread-safety

-1
推荐指数
1
解决办法
46
查看次数

如何知道特定的Java类是否是线程安全的?

  1. 是否所有不在 java.util.concurrent 下的类在多线程环境中都不安全?
  2. 如果第一点是错误的,你如何知道一个特定的类是否是线程安全的?

java multithreading thread-safety

-1
推荐指数
1
解决办法
78
查看次数

证明RxJava中的PublishSubject不是线程安全的

声明PublishSubject在RxJava中不是线程安全的.好.

我试图找到任何一个例子,我试图构建任何一个例子来模拟竞争条件,这会导致不必要的结果.但我不能:(

任何人都可以提供一个证明PublishSubject不是线程安全的例子吗?

java multithreading thread-safety rx-java

-2
推荐指数
1
解决办法
857
查看次数

如何将 AtomicInteger 增加两次?

我需要将 AtomicInteger 增加两次,例如:++i; ++i; 通过无尽的循环,我想将计数器增加两次并检查奇偶校验。但我总是得到增加一次的变量。如何解决?

java thread-safety java.util.concurrent

-2
推荐指数
1
解决办法
9208
查看次数

在那些简单的情况下使用 C# 锁有用吗?

在多线程环境中,锁定对线程敏感的资源很重要。我经常假设集合等是线程不安全的,具体取决于 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

-2
推荐指数
1
解决办法
62
查看次数

我怎么能相信'锁'了?

回到我原来的非托管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)

c# multithreading thread-safety

-3
推荐指数
1
解决办法
215
查看次数