1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

Не работает Criticalsection

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

  1. mibin

    mibin Well-Known Member

    Репутация:
    0
    Регистрация:
    29 янв 2009
    Сообщения:
    48
    Симпатии:
    0
    Привет! Вот мой код
    Код:
    __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

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

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Вот тебе простой и наглядный пример:
    Код:
    #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

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

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Таких как ты мы всегда рады видеть на нашем форуме!
    Спасибо что публикуешь свое условие обоснованно.
     
Загрузка...
Похожие Темы - Не работает Criticalsection
  1. abdurtim
    Ответов:
    8
    Просмотров:
    277
  2. ghostphisher
    Ответов:
    26
    Просмотров:
    708
  3. seoman2
    Ответов:
    5
    Просмотров:
    283
  4. lemuriez
    Ответов:
    0
    Просмотров:
    246
  5. zehrx
    Ответов:
    5
    Просмотров:
    506

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