CRITICAL_SECTION 类型中的 LockCount 为什么都是负数

qq_32680341 2016-04-04 10:56:17
按道理来说只要有线程的时候 不是应该 LockCount 只会大于 0 为什么我写的会出现 -2 ,-6, -7 这样的情况是我写错了吗


DWORD WINAPI Thread(LPVOID lpParameter)
{

for (int i = NULL; i < 10; i++)
{
Sleep(2000);
EnterCriticalSection(&cs);
printf("一号线程 : %d %x %x \n", cs.LockCount, cs.RecursionCount, cs.OwningThread);
LeaveCriticalSection(&cs);
}

return NULL;

}
DWORD WINAPI Thread_1(LPVOID lpParameter)
{

for (int i = NULL; i < 10; i++)
{
Sleep(2000);
EnterCriticalSection(&cs);
printf("二号线程 : %d %x %x \n", cs.LockCount, cs.RecursionCount, cs.OwningThread);
LeaveCriticalSection(&cs);
}
return NULL;
}
DWORD WINAPI Thread_2(LPVOID lpParameter)
{
//
for (int i = NULL; i < 10; i++)
{

Sleep(2000);
EnterCriticalSection(&cs);

printf("三号线程 : %d %x %x \n", cs.LockCount, cs.RecursionCount, cs.OwningThread);

LeaveCriticalSection(&cs);
}
return NULL;
}

int _tmain(int argc, _TCHAR* argv[])
{
//初始化
InitializeCriticalSection(&cs);
//InitializeCriticalSection(&_cs);
printf(" : %x %x %x \n", cs.LockCount, cs.RecursionCount, cs.OwningThread);
//启动线程

HANDLE haHWND = CreateThread(NULL, NULL, Thread, NULL, NULL, NULL);
HANDLE haHWND_1 = CreateThread(NULL, NULL, Thread_1, NULL, NULL, NULL);
HANDLE haHWND_2 = CreateThread(NULL, NULL, Thread_2, NULL, NULL, NULL);

Sleep(1000 * 60 * 60);
return 0;
}
...全文
2551 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-19
  • 打赏
  • 举报
回复
查MSDN是Windows程序员必须掌握的技能之一。
bjyfcx 2018-03-19
  • 打赏
  • 举报
回复
我明白了,这个负数你换算成8位二进制,最后一位0表示临界区被锁,1表示未锁,倒数第二位用0和1表示是否有线程被唤醒,剩下的几位你取反所得的十进制的值就等待的线程数,比如-22,二进制就是11101010,最后一位是0表示临界区解锁,倒数第二位1表示有线程被唤醒,最后几位111010取反是101,表示5个线程正在等待;再比如你说的-6,二进制就是11111010,最后一位是0表示临界区解锁,倒数第二位1表示有线程被唤醒,最后几位111110取反是1,表示一个线程正在等待
bjyfcx 2018-03-18
  • 打赏
  • 举报
回复
楼主问题解决了吗?我也遇到这种情况,vs2013中lockcount进入临界区后不是-2就是-6,我觉得代码没问题,出现-2和-6好像与系统有关
Elon__Musk 2017-03-22
  • 打赏
  • 举报
回复
官网有解释:https://msdn.microsoft.com/en-us/library/windows/hardware/ff541979(v=vs.85).aspx
qq_32680341 2016-04-05
  • 打赏
  • 举报
回复
使用的编译器是 VS2013 是我代码写错了吗 LockCount 都是 负值 是什么原因产生的 还是本来就是 负值
qq_32680341 2016-04-05
  • 打赏
  • 举报
回复
qq_32680341 2016-04-05
  • 打赏
  • 举报
回复
我锁住了 , 还能死锁 .RecursionCount 的值是 1 OwningThrea 只是3位到4位的ID 唯独LockCount 是-6- 2几乎无规律 EnterCriticalSection 以后 结构刷新 了 LockCount 可是是负 LeaveCriticalSection 以后 LockCount 的值重新刷成了 -1
zgl7903 2016-04-05
  • 打赏
  • 举报
回复
单步调试一下看看

  CRITICAL_SECTION cs;
  InitializeCriticalSection(&cs);
  EnterCriticalSection(&cs);
  LeaveCriticalSection(&cs);
InitializeCriticalSection 后 LockCount(-1); RecursionCount (0); OwningThread(0) EnterCriticalSection 后 LockCount(0); RecursionCount (1); OwningThread(xxx); LeaveCriticalSection 后 LockCount(-1); RecursionCount (0); OwningThread(0) LockCount为负值 也就是没有锁, 0 有锁

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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