【发布时间】:2021-10-05 11:37:53
【问题描述】:
CodeBlockA;
Lock;
CodeBlockB;
Unlock;
CodeBlockC
代码块可能包含很多代码,以它为一个单元即可。
CodeBlockA CodeBlockB CodeBlockC 是否总是串行执行? lock 是如何实现的?
【问题讨论】:
-
我相信是的。看看this。
-
这取决于您所说的“串行”是什么意思。在单个线程中,在某些意义上它实际上可能不是串行的,但除非您导致 UB,否则代码的可观察行为将就像它一样。如果其他线程可以看到代码块的效果,它们可能会或可能不会按顺序观察这些效果,除非锁包含适当的内存屏障。查找“C 内存排序”。
-
锁定/解锁仅在您运行多个线程或进程时才有意义。相对于那些它可以并行或以任何顺序运行。但是,在单个线程或进程中,执行顺序不能改变。因此,除非您的“锁定/解锁”有其他含义,否则您的代码会在编写时执行。
标签: c mutex critical-section spinlock lockless