• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Не работает 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

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

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