核心编程中互斥量的疑问三点

花熊 2012-06-03 02:30:11
核心编程里说到,互斥量和关键段都有线程相关性,都有一个递归次数,所以我很无聊的做过这样的测试:

DWORD WINAPI CDemoDlg::Thread1(LPVOID lp)
{
CDemoDlg *pthis = (CDemoDlg*)lp;
EnterCriticalSection(&pthis->cs);
EnterCriticalSection(&pthis->cs);//第二次进入
TRACE("Thread1\r\n");
LeaveCriticalSection(&pthis->cs);
while (true)
{
// 保证线程不结束
}
return true;
}

DWORD WINAPI CDemoDlg::Thread2(LPVOID lp)
{
CDemoDlg *pthis = (CDemoDlg*)lp;
EnterCriticalSection(&pthis->cs);
TRACE("Thread2\r\n");
LeaveCriticalSection(&pthis->cs);
while (true)
{
// 保证线程不结束
}
return true;
}

我让thread1对关键段cs递归次数为2(Entry两次),而只Leave一次,事实上结果表示和核心编程一样的,thread2一直处于非调度状态

实验2:我把关键段换成互斥量:

DWORD WINAPI CDemoDlg::Thread1(LPVOID lp)
{
CDemoDlg *pthis = (CDemoDlg*)lp;
WaitForSingleObject(pthis->m_Mutex, INFINITE);
WaitForSingleObject(pthis->m_Mutex, INFINITE);//第二次进入
TRACE("Thread1\r\n");
ReleaseMutex(pthis->m_Mutex);
while (true)
{
// 保证线程不结束
}
return true;
}

DWORD WINAPI CDemoDlg::Thread2(LPVOID lp)
{
CDemoDlg *pthis = (CDemoDlg*)lp;
WaitForSingleObject(pthis->m_Mutex, INFINITE);
TRACE("Thread2\r\n");
ReleaseMutex(pthis->m_Mutex);
while (true)
{
// 保证线程不结束
}
return true;
}

我们却发现thread2是可以等到互斥量的,也就是说虽然thread1是wait了两次,却只需要Release一次,
但是核心编程里特别说明了:“如果线程成功的等待了互斥量对象不止一次,那么线程必须调用ReleaseMutex相同的次数才能使对象的递归计数变为0,然后触发对象”,这是疑问1?不知道有没有高手解答下:
后面又做了几个实验:发现以下几点都有疑问:
核心编程对互斥量提到了一个线程所有权的概念:“当线程调用ReleaseMutex的时候,函数会检查调用线程的线程ID与互斥量内部保存的线程ID是否一致,如不一致,则ReleaseMutex失败”,
但是我实验的结果是:在thread1中wait后,再在thread2中release,竟然是成功的?这是疑问2?

核心编程里第三个说到了互斥量被遗弃的说法,意思为当拥有互斥量的线程在释放互斥量之前终止,系统会自动把互斥量置为可调度的,但事实是,如果让thread1拥有互斥量,然后正常终止,thread2的确可以wait到,但如果是TerminateThread,thread2永远也wait不到?,这是疑问3

尽信书不如无书,求高手指点.万分感谢.



...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
花熊 2012-06-04
  • 打赏
  • 举报
回复
不是,是创建内核失败了,所以怎么wait都OK,自己也晕了,这些问题前些年就写代码验证过,哎,自己找抽.
gold_water 2012-06-03
  • 打赏
  • 举报
回复
stjay 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

sorry,此贴做废,核心编程是正确的,刚发现自己代码BUG。
[/Quote]

是不是没考虑两个线程的执行顺序?
条件应该是保证Thread1要执行到 while (true),Thread2才开始执行 吧
tzxx 2012-06-03
  • 打赏
  • 举报
回复
代码啥bug,分享一下?
花熊 2012-06-03
  • 打赏
  • 举报
回复
当自己加深印象,核心编程这三点都正确
花熊 2012-06-03
  • 打赏
  • 举报
回复
sorry,此贴做废,核心编程是正确的,刚发现自己代码BUG。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧