Не работает Criticalsection

mibin

Well-Known Member
29.01.2009
48
0
29
Видное
#1
Привет! Вот мой код
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);
}
//---------------------------------------------------------------------------
Если я два раза запускаю этот поток то критические секции не отрабатывают...потоки работают параллельно хотя второй должен был ждать первый...объясните пожалуйста в чем беда?
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#2
Показывай целый код. Скорее всего у тебя crit на каждый поток своя.
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#3
Вот тебе простой и наглядный пример:
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;
}
 

mibin

Well-Known Member
29.01.2009
48
0
29
Видное
#4
Извините не мог выйти в инет некоторое время.
Короче проблема нашлась, я сделал глобальную переменную внутри класса потока, как только я ее вынес из него все заработало! Спасибо за помощь! :sorry:
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#5
Таких как ты мы всегда рады видеть на нашем форуме!
Спасибо что публикуешь свое условие обоснованно.