Multithreading 如果两个线程执行EnterCriticalSection,而线程1执行DeleteCriticalSection,会发生什么情况

Multithreading 如果两个线程执行EnterCriticalSection,而线程1执行DeleteCriticalSection,会发生什么情况,multithreading,winapi,deadlock,critical-section,Multithreading,Winapi,Deadlock,Critical Section,我正在寻找我的程序中可能出现的死锁,我怀疑以下情况。 如果两个线程同时调用EnterCriticalSection,线程#1在输入后立即调用DeleteCriticalSection,那么仍在EnterCriticalSection调用中的线程#2会发生什么情况 谢谢 如果两个线程同时调用EnterCriticalSection,会发生什么情况 线程#1在输入后立即调用DeleteCriticalSection,什么 线程#2是否仍在EnterCriticalSection调用中 两个线程不能同

我正在寻找我的程序中可能出现的死锁,我怀疑以下情况。 如果两个线程同时调用EnterCriticalSection,线程#1在输入后立即调用DeleteCriticalSection,那么仍在EnterCriticalSection调用中的线程#2会发生什么情况

谢谢

如果两个线程同时调用EnterCriticalSection,会发生什么情况 线程#1在输入后立即调用DeleteCriticalSection,什么 线程#2是否仍在EnterCriticalSection调用中

两个线程不能同时进入临界段。这将破坏关键部分的目的。要么线程#1首先进入临界段,要么线程#2首先进入临界段。这里有两种可能的交错

假设交错是这样的:

Thread 1 Thread 2 -------- -------- | | | | EnterCS() | Lock Taken | | | | EnterCS() | Blocked | | | | DeleteCS() | | | | ??? | ... Thread 1 Thread 2 -------- -------- | | | | | EnterCS() | Lock Taken | | EnterCS() | Blocked | | | | | | ExitCS() | Lock Released | | Unblocked | LockTaken | | | DeleteCS() | | | | | ... ... 现在,两种可能的交错如下所示:

Thread #2 acquires lock first: . Thread #1 acquires lock first: . Thread 1 Thread 2 . Thread 1 Thread 2 -------- -------- . -------- -------- | | . | | | EnterCS() . EnterCS() | | Lock Taken . Lock Taken | | | . | | EnterCS() | . // Do stuff EnterCS() Blocked // Do stuff . | Blocked | | . | | | | . ExitCS() | | ExitCS() . Lock Released | | Lock Released . | | | | . | Unblocked Unblocked | . | Lock Taken Lock Taken | . | | | | . | // Do stuff // Do stuff | . | | | | . | ExitCs() ExitCS() | . | Lock Released Lock Released | . | | | | . | | | | . | | WaitForThread2() --+ . WaitForThread2() --+ | . | DeleteCS() . DeleteCS() | . | | . | done . done 线程#2首先获取锁:。线程#1首先获取锁: . 螺纹1螺纹2。螺纹1螺纹2 -------- -------- . -------- -------- | | . | | |EnterCS()。企业()| |锁上了。锁定| | | . | | EnterCS()|.//做些什么 做点什么此 路 不通 | | . | | | | . ExitCS()| |ExitCS()。开锁| |锁已释放。|| | | . | 畅通 畅通|.|锁定 锁上了|.|| | | . | // 做事 //做事| | | . | ExitCs() ExitCS()|.|开锁 锁已释放|.|| | | . | | | | . | | WaitForThread2()-->。WaitForThread2()--+ | . | DeleteCS()。DeleteCS() | . | | . | 完成。完成
WaitForThread2()
的确切实现将取决于程序的性质,但肯定会涉及或其任何一个亲属。

不完全正确,因为DeleteCriticalSection将删除内存,而EnterCriticalSection应引发访问冲突异常。除非在我的情况下它不会引发异常,否则我会出现死锁。文档与您的意见不一致:首先,我假设线程#1不会调用LeaveCriticalSection,如果它计划删除它。但是,线程#2在等待时被阻塞,现在处于未定义状态行为,因此不可靠。底线:不要这样做。确保所有线程都保留了所有权,并在删除之前等待所有权条件,这样就可以了。 Thread #2 acquires lock first: . Thread #1 acquires lock first: . Thread 1 Thread 2 . Thread 1 Thread 2 -------- -------- . -------- -------- | | . | | | EnterCS() . EnterCS() | | Lock Taken . Lock Taken | | | . | | EnterCS() | . // Do stuff EnterCS() Blocked // Do stuff . | Blocked | | . | | | | . ExitCS() | | ExitCS() . Lock Released | | Lock Released . | | | | . | Unblocked Unblocked | . | Lock Taken Lock Taken | . | | | | . | // Do stuff // Do stuff | . | | | | . | ExitCs() ExitCS() | . | Lock Released Lock Released | . | | | | . | | | | . | | WaitForThread2() --+ . WaitForThread2() --+ | . | DeleteCS() . DeleteCS() | . | | . | done . done