使用简单的CRITICAL_SECTION似乎处于死锁状态

using a simple CRITICAL_SECTION, seem to be deadlocked

本文关键字:于死锁 死锁 状态 简单 CRITICAL SECTION      更新时间:2023-10-16

我有一个简单的C程序,它使用CRITICAL_SECTION。由于某种原因,它似乎一次又一次地进入CRITICAL_SECTION,而没有真正执行里面的代码,导致线程死锁。我似乎找不出原因。

这是代码:

#include <windows.h>
#include <iostream>
#define N 100000000
CRITICAL_SECTION cs;
static DWORD WINAPI safe_increment(void *param)
{
   volatile long* x = (volatile long*)param;
   for(int i=0;i<N;++i)
      EnterCriticalSection(&cs);
      ++(*x);
      LeaveCriticalSection(&cs);
   return 0;
}
void main()
{
   InitializeCriticalSection(&cs);
  volatile long x = 0;
  HANDLE h[2];
  DWORD thread_id;
   int x = 0;
   h[0] = CreateThread(NULL,0,safe_increment,(void*)&x,0,&thread_id);
   h[1] = CreateThread(NULL,0,safe_increment,(void*)&x,0,&thread_id);
   WaitForMultipleObjects(2,h,TRUE,INFINITE);
   CloseHandle(h[0]);
   CloseHandle(h[1]);
   DeleteCriticalSection(&cs);
   std::cout << "Result of safe increment: " << x << "n";
}

谢谢!

罗伊。

for循环中的错误。应为:

for(int i=0;i<N;++i)
{ // <---
      EnterCriticalSection(&cs);
      ++(*x);
      LeaveCriticalSection(&cs);
} // <---

没有大括号,所以for循环只执行EnterCriticalSection(),而不执行其他内容。获得关键部分的第一个线程从未释放它:死锁