使用简单的CRITICAL_SECTION,似乎陷入僵局

roy*_*ybj 1 c++ multithreading critical-section

我有一个使用CRITICAL_SECTION的简单C程序.由于某种原因,它似乎一次又一次地进入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";
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

罗伊.

hmj*_*mjd 9

for循环错误.应该:

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

没有大括号所以for循环只执行EnterCriticalSection()而没有别的.获得临界区的第一个线程从未发布它:死锁.