问题描述
- WIN32 多线程程序设计一书中有如下部分。
-
问下这样的程序为什么会产生死锁?
当线程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 类 可用
时间: 2024-09-27 00:08:15