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

时间:2012-02-21 21:10:05

标签: 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";
}
谢谢你!

罗伊。

1 个答案:

答案 0 :(得分:9)

for循环中的错误。应该是:

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

没有大括号,因此for循环仅执行EnterCriticalSection()而没有其他任何内容。获得关键部分的第一个线程从未发布过它:死锁