问下这样的程序为什么会产生死锁?
当线程A 执行InitializeCriticalSection(list1->critical_sec);之后线程B怎么还可能执行
InitializeCriticalSection(list2->critical_sec); 这段不是早就被A给锁住了吗?
void SwapLists(List *list, List *list2)
{
List *tmp_list;
EnterCriticalSection(list1->critical_sec);
EnterCriticalSection(list2->critical_sec);
tmp->list = list1->head;
list1->head = list2->head;
list2->head = temp->list;
LeaveCriticalSection(list1->critical_sec);
LeaveCriticalSection(list2->critical_sec);
}
因为两个线程的list1和list2参数可以不同,假设A调用的参数(这里指实参,不是形参)是list1 list2,B调用的是list2 list1
那么可能两个list都锁上,并且等待另一个。
你的疑惑在于,你觉得多个线程都是调用的一样的参数。
InitializeCriticalSection 最好在用临界区的线程之外做
不然没有初始化的临界区,EnterCriticalSection 是会出错的
一个简单的方式是,用类封装临界区,
用 构造函数 InitializeCriticalSection,析构函数DeleteCriticalSection
这样EnterCriticalSection,LeaveCriticalSection 这种加锁,解锁的函数才不会出问题。
MFC有CCriticalSection 类 可用