Не работает Criticalsection

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем mibin, 11 дек 2010.

  1. mibin

    mibin Well-Known Member

    Регистрация:
    29 янв 2009
    Сообщения:
    48
    Симпатии:
    0
    Привет! Вот мой код
    Код (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);
    }
    //---------------------------------------------------------------------------
    Если я два раза запускаю этот поток то критические секции не отрабатывают...потоки работают параллельно хотя второй должен был ждать первый...объясните пожалуйста в чем беда?
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Показывай целый код. Скорее всего у тебя crit на каждый поток своя.
     
  3. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Вот тебе простой и наглядный пример:
    Код (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;
    }
     
  4. mibin

    mibin Well-Known Member

    Регистрация:
    29 янв 2009
    Сообщения:
    48
    Симпатии:
    0
    Извините не мог выйти в инет некоторое время.
    Короче проблема нашлась, я сделал глобальную переменную внутри класса потока, как только я ее вынес из него все заработало! Спасибо за помощь! :sorry:
     
  5. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Таких как ты мы всегда рады видеть на нашем форуме!
    Спасибо что публикуешь свое условие обоснованно.
     
Загрузка...

Поделиться этой страницей