Форум программистов, компьютерный форум CyberForum.ru

CRITICAL_SECTION 2 потока - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
QenT
 Аватар для QenT
37 / 37 / 1
Регистрация: 29.01.2009
Сообщений: 244
04.07.2011, 06:48     CRITICAL_SECTION 2 потока #1
Задача заставить 2 потока работать точно друг за другом(по очереди):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
main()
{
/*инициализация*/
EnterCriticalSection( &cs );//блокировка первого потока
EnterCriticalSection( &cs2 );//блокировка второго потока
/*запуск потоков*/
}
DWORD WINAPI Func1(PVOID pvParam)
{
        LeaveCriticalSection( &cs );//разблокирование первого потока 
        while(1) 
        {       
    EnterCriticalSection( &cs );//блокировка первого потока после выполнения
           /*..........*/
    LeaveCriticalSection( &cs2 ); //разблокирование второго потока       
         } 
        return 0;
};
DWORD WINAPI Func2(PVOID pvParam)
{        
        while(1) 
        {       
    EnterCriticalSection( &cs2 );//блокировка второго потока после выполнения
           /*..........*/
    LeaveCriticalSection( &cs );//разблокирование первого потока        
         } 
        return 0;
};
Но идею с процессами я видать не правильно понял, так как в итоге два процесса работают без какого либо ограничения в последовательности и даже такой пример с одним потоком работает бесконечно, хотя вроде должен блокироваться на втором вхождении в критическую секцию:
C++
1
2
3
4
5
6
7
8
9
DWORD WINAPI Func1(PVOID pvParam)
{
        while(1) 
        {       
    EnterCriticalSection( &cs );//бесконечно входит в критическую секцию не блокируясь
           /*..........*/     
         } 
        return 0;
};
Буду очень благодарен объяснению данной проблемы и примеру для решения задания.

Добавлено через 1 час 1 минуту
Решение задачи реализовал за счет эвентов, но все равно буду рад услышать что не так с критическими секциями.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2011, 06:48     CRITICAL_SECTION 2 потока
Посмотрите здесь:

Синхронизация потоков. CRITICAL_SECTION C++ WinAPI
Visual C++ VC++6.0, как из порожденного потока прочитать переменную главного потока?
Создание потока C++ Builder
Создание потока из потока. C++
Visual C++ Считывание с потока
C++ Очистка потока
C++ Функция потока
C++ Создание потока
C++ WinAPI Приоритет потока
critical_section.2 потока C++ Builder
CRITICAL_SECTION (необходимо исправить ошибки кода) C++ WinAPI
C++ Очистка потока

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nxnx
Формучанин
361 / 292 / 16
Регистрация: 02.11.2010
Сообщений: 1,232
04.07.2011, 22:00     CRITICAL_SECTION 2 потока #2
А зачем нужны потоки, которые работают не одновременно, а по очереди?
QenT
 Аватар для QenT
37 / 37 / 1
Регистрация: 29.01.2009
Сообщений: 244
04.07.2011, 22:32  [ТС]     CRITICAL_SECTION 2 потока #3
это абстрактная задача, для лучшего понимания потоков, а вообще как вариант два потока должны заниматься своими вычислениями, а выводить на экран только последовательно.
nxnx
Формучанин
361 / 292 / 16
Регистрация: 02.11.2010
Сообщений: 1,232
04.07.2011, 23:03     CRITICAL_SECTION 2 потока #4
Цитата Сообщение от QenT Посмотреть сообщение
это абстрактная задача, для лучшего понимания потоков, а вообще как вариант два потока должны заниматься своими вычислениями, а выводить на экран только последовательно.
это абсурдная задача, заставлять два потока работать по очереди
Daemon025
 Аватар для Daemon025
380 / 329 / 67
Регистрация: 06.12.2010
Сообщений: 900
04.07.2011, 23:27     CRITICAL_SECTION 2 потока #5
так будет выглядеть на яве, WinAPI не учил, поэтому надеюсь этот пример поможет:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class NewThread implements Runnable {
  Thread t;
 
  NewThread() {
    t= new Thread(this,"new thread");
    System.out.println("novyj potok");
    t.start();
  }
 
  public void run() {
    try {
      for (int i=5; i>0; i--) {
        System.out.println("secondary thread: "+i);
        Thread.slepp(500);
      }
    } catch(InterruptedException e) {
       System.out.println("int.. of secondary thread");
    }
    System.out.println("end of secondary thread");
  }
}
 
 
class ThreadDemo {
  public static void main(String[] args) {
    new newThread(); // sozdajiom novyj potok
 
    try {
      for (int i=5; i>0; i--) {
        System.out.println("Main thread: "+i);
        Thread.sleep(1000);
      }
    } catch(InterruptedException e) {
       System.out.println("int.. of main thread"):
    }
    System.out.println("end of the main thread");
  }
}
niXman
Эксперт C++
 Аватар для niXman
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.07.2011, 10:20     CRITICAL_SECTION 2 потока #6
используй OpenMP(#pragma omp barrier).
хватит в 21ом веке руками делать то, что уже лет 8 компилятор может сделать сам. и однозначно лучше
Yandex
Объявления
05.07.2011, 10:20     CRITICAL_SECTION 2 потока
Ответ Создать тему
Опции темы

Текущее время: 20:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru