используя простой CRITICAL_SECTION, похоже, зашли в тупик - PullRequest
1 голос
/ 22 февраля 2012

У меня есть простая программа на 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";
}

спасибо!

Рой.

1 Ответ

9 голосов
/ 22 февраля 2012

Ошибка в цикле for. Должно быть:

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

Никаких фигурных скобок, поэтому цикл for выполняется только EnterCriticalSection() и ничего больше. Первый поток, получивший критическую секцию, никогда не выпускал ее: deadlock .

...