当我说原子性时,我的意思是一组指令将在同一进程的其他线程之间没有上下文切换的情况下执行(当然还需要进行其他类型的切换)。我想到的唯一解决方案是在执行当前部分之前暂停除当前执行的线程外的所有线程,并在执行后恢复它们。还有更优雅的方法吗?
我想这么做的原因是收集多个线程上运行的对象的连贯状态。但是,它们的代码无法更改(它们已经编译好了),因此我无法在其中插入互斥量、信号量等。原子操作当然是状态收集(即拷贝某些变量)。
当我说原子性时,我的意思是一组指令将在同一进程的其他线程之间没有上下文切换的情况下执行(当然还需要进行其他类型的切换)。我想到的唯一解决方案是在执行当前部分之前暂停除当前执行的线程外的所有线程,并在执行后恢复它们。还有更优雅的方法吗?
我想这么做的原因是收集多个线程上运行的对象的连贯状态。但是,它们的代码无法更改(它们已经编译好了),因此我无法在其中插入互斥量、信号量等。原子操作当然是状态收集(即拷贝某些变量)。
object lck = new object();
lock(lck)
{
// thread safe code goes in here
}
不,那是违反多任务处理的原则。
除非是非常简单的操作,比如增量操作……这些并不是你问题的重点。
Interlocked.Increment()
等等。 - Xaqron可以通过由原子单读/多写寄存器集合(数组)组成的共享内存获取全局状态。解决方案简单但不平凡。您可以阅读论文“共享内存的原子快照”中发布的算法,或者阅读多处理器编程艺术书的第4章,在那里您可以获得有关Java语言实现的想法。当然,一旦您熟悉了这个想法,就应该能够将其传输到任何其他语言。如果我的英语不够好,请见谅。
long
/ulong
/double
就不是原子操作。 - cdhowie