【发布时间】:2010-07-16 22:25:25
【问题描述】:
可以使用 CRITICAL_SECTION 变量来实现互斥。
我的问题是:CRITICAL_SECTION 是否支持复制?如果我按值将一个传递给另一个线程,我可以确定互斥会起作用吗?
如果答案是“你不能那样做”,我不会感到惊讶,但最好能得到某种官方确认。无论哪种方式,我都无法在文档中找到声明。
【问题讨论】:
标签: c winapi synchronization
可以使用 CRITICAL_SECTION 变量来实现互斥。
我的问题是:CRITICAL_SECTION 是否支持复制?如果我按值将一个传递给另一个线程,我可以确定互斥会起作用吗?
如果答案是“你不能那样做”,我不会感到惊讶,但最好能得到某种官方确认。无论哪种方式,我都无法在文档中找到声明。
【问题讨论】:
标签: c winapi synchronization
没有。无法复制 CRITICAL_SECTION。 MSDN states this explicitly:
不能移动或复制临界区对象。
【讨论】:
快速搜索标题会发现该结构是在winnt.h 中定义的,而这个定义显然表明复制该结构是行不通的。
typedef struct _RTL_CRITICAL_SECTION {
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
//
// The following three fields control entering and exiting the critical
// section for the resource
//
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread; // from the thread's ClientId->UniqueThread
HANDLE LockSemaphore;
ULONG_PTR SpinCount; // force size on 64-bit systems when packed
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
也就是说,我不知道为什么这些内部计数器存储在用户空间结构中,即如果程序修改这些会发生什么?
【讨论】:
CRITICAL_SECTION 的内容:“进程也不能修改对象,但必须将其视为逻辑不透明。”