我需要锁定一个对象(集合),执行一些操作并调用一个使用ThreadPool(在同一锁定块内)打开线程的函数。

我的问题是,在新线程内执行的操作是否仍被认为是线程安全的?

最佳答案

您可能会在线程完成其工作之前释放该锁,除非您等待它退出。

lock(collection){
  DoSomeWork();
  LaunchNewThread(); =>  newThread starts
} => the lock will likely be released BEFORE newThread ends

因此,在释放锁之前,您必须等待newThread完成。理想的解决方案是在newThread中执行所有操作(锁定和DoSomeWork)。如果不可能,则可以创建另一个锁定的线程,然后等待newThread结束:
anotherThread{
    lock(collection){
      DoSomeWork();
      LaunchNewThread();
      newThread.JOIN(); => execution will stop until newThread finishes
    } => the lock will be released AFTER newThread returns
}

关于c# - 锁内的新线程-C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21428298/

10-10 01:09