• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Не работает Criticalsection

  • Автор темы mibin
  • Дата начала
M

mibin

Привет! Вот мой код
C++:
__fastcall _tSocket::_tSocket(bool CreateSuspended)
: TThread(CreateSuspended)
{
InitializeCriticalSection(&crit);
}
//---------------------------------------------------------------------------
void __fastcall _tSocket::UpdateCaption()
{
i++;
}

void __fastcall _tSocket::Execute()
{
NameThreadForDebugging("nSocket");
//---- Place thread code here ----
EnterCriticalSection(&crit);
i = 0;
for (i = 0; i < 1000000000; i++) {
i++;
//Synchronize(&UpdateCaption);
UpdateCaption();
}
ShowMessage(String(i));
LeaveCriticalSection(&crit);
}
//---------------------------------------------------------------------------

Если я два раза запускаю этот поток то критические секции не отрабатывают...потоки работают параллельно хотя второй должен был ждать первый...объясните пожалуйста в чем беда?
 
L

lazybiz

Показывай целый код. Скорее всего у тебя crit на каждый поток своя.
 
L

lazybiz

Вот тебе простой и наглядный пример:
C++:
#include <windows.h>
#include <iostream.h>

CRITICAL_SECTION	cs;
HANDLE				hThreads[2];
BOOL				bExit = FALSE;

DWORD WINAPI thread_1( LPVOID lpParam )
{
while ( !bExit ) {
EnterCriticalSection( &cs );

cout << "thread_1" << endl;

LeaveCriticalSection( &cs );
}
return 0;
}

DWORD WINAPI thread_2( LPVOID lpParam )
{
int	i = 0;
ResumeThread( hThreads[0] );
while ( i < 10 ) {
EnterCriticalSection( &cs );

cout << "thread_2: " << i << endl;
Sleep( 500 );

LeaveCriticalSection( &cs );
i++;
}
bExit = TRUE;
return 0;
}

int main()
{
InitializeCriticalSection( &cs );

hThreads[0] = CreateThread( NULL, 0, thread_1, NULL, CREATE_SUSPENDED, NULL );
hThreads[1] = CreateThread( NULL, 0, thread_2, NULL, 0, NULL );
WaitForMultipleObjects( 2, hThreads, TRUE, INFINITE );

DeleteCriticalSection( &cs );
return 0;
}
 
M

mibin

Извините не мог выйти в инет некоторое время.
Короче проблема нашлась, я сделал глобальную переменную внутри класса потока, как только я ее вынес из него все заработало! Спасибо за помощь! :sorry:
 
L

lazybiz

Таких как ты мы всегда рады видеть на нашем форуме!
Спасибо что публикуешь свое условие обоснованно.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!