按道理來說只要有執行緒的時候 不是應該 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;
}
uj5u.com熱心網友回復:
單步除錯一下看看
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 有鎖
uj5u.com熱心網友回復:
我鎖住了 , 還能死鎖 .RecursionCount 的值是 1 OwningThrea 只是3位到4位的ID 唯獨LockCount 是-6- 2幾乎無規律EnterCriticalSection 以后 結構重繪 了 LockCount 可是是負
LeaveCriticalSection 以后 LockCount 的值重新刷成了 -1
uj5u.com熱心網友回復:
使用的編譯器是 VS2013 是我代碼寫錯了嗎 LockCount 都是 負值 是什么原因產生的 還是本來就是 負值uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
官網有解釋:https://msdn.microsoft.com/en-us/library/windows/hardware/ff541979(v=vs.85).aspxuj5u.com熱心網友回復:
樓主問題解決了嗎?我也遇到這種情況,vs2013中lockcount進入臨界區后不是-2就是-6,我覺得代碼沒問題,出現-2和-6好像與系統有關uj5u.com熱心網友回復:
我明白了,這個負數你換算成8位二進制,最后一位0表示臨界區被鎖,1表示未鎖,倒數第二位用0和1表示是否有執行緒被喚醒,剩下的幾位你取反所得的十進制的值就等待的執行緒數,比如-22,二進制就是11101010,最后一位是0表示臨界區解鎖,倒數第二位1表示有執行緒被喚醒,最后幾位111010取反是101,表示5個執行緒正在等待;再比如你說的-6,二進制就是11111010,最后一位是0表示臨界區解鎖,倒數第二位1表示有執行緒被喚醒,最后幾位111110取反是1,表示一個執行緒正在等待uj5u.com熱心網友回復:
查MSDN是Windows程式員必須掌握的技能之一。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/73868.html
標籤:進程/線程/DLL
下一篇:哈希表程式運行問題?
