Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
QenT
38 / 38 / 1
Регистрация: 29.01.2009
Сообщений: 244
#1

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

04.07.2011, 06:48. Просмотров 1528. Ответов 5
Метки нет (Все метки)

Задача заставить 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 минуту
Решение задачи реализовал за счет эвентов, но все равно буду рад услышать что не так с критическими секциями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2011, 06:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос CRITICAL_SECTION 2 потока (C++):

Состояние файлового потока - C++
.... fostream log; .... class A { public: A (); }; A::A() {

Остановка рабочей функции потока - C++
День добрый. Задумался над таким вот вопросом. Допустим, у меня есть две функции get(StopObj obj) и process(StopObj obj). Эти две функции...

Оболочка потока. Опять неоднозначность - C++
//=========================================================================================================================================...

Как узнать статус потока? - C++
добрый вечер, не подскажите, как узнать статус потока? Желательно, чтобы функция возвращала 0, если поток засуспендин, или 1 если он...

Как сделать так, чтобы в окне, созданом OpenGL, рисовали 2 потока? - C++
Вот не знаю, где создать тему, с одной стороны это надо в разделе OpenGL, с другой стороны- там чисто художники, а здесь именно...

Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу) - C++
Да, как? #include <windows.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> void *BusyWork(void *t) { ...

5
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
04.07.2011, 22:00 #2
А зачем нужны потоки, которые работают не одновременно, а по очереди?
0
QenT
38 / 38 / 1
Регистрация: 29.01.2009
Сообщений: 244
04.07.2011, 22:32  [ТС] #3
это абстрактная задача, для лучшего понимания потоков, а вообще как вариант два потока должны заниматься своими вычислениями, а выводить на экран только последовательно.
0
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
04.07.2011, 23:03 #4
Цитата Сообщение от QenT Посмотреть сообщение
это абстрактная задача, для лучшего понимания потоков, а вообще как вариант два потока должны заниматься своими вычислениями, а выводить на экран только последовательно.
это абсурдная задача, заставлять два потока работать по очереди
0
Daemon025
380 / 329 / 67
Регистрация: 06.12.2010
Сообщений: 900
04.07.2011, 23:27 #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");
  }
}
1
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.07.2011, 10:20 #6
используй OpenMP(#pragma omp barrier).
хватит в 21ом веке руками делать то, что уже лет 8 компилятор может сделать сам. и однозначно лучше
0
05.07.2011, 10:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2011, 10:20
Привет! Вот еще темы с ответами:

critical_section.2 потока - C++ Builder
есть программа которая выводит из txt файла символы последовательно с интервалом, реализовано с помощью critical_section. Но преподватель...

Завершение потока - C++ Builder
Здравствуйте! На этот раз у меня вопрос про потоки. Как мне в определенном процессе завершить определенный поток??? Ручками с помощью...

Функция потока - C++ Builder
Создаю функцию потока.Хочу её прописать в .h файле как метод класса,но не получается..почему?Выдает такую ошибку билдер

Создание потока - C++ Builder
Не могу понять как создать поток(( Напишите пример, в одном потоке чтобы было Label1->Caption=123; а во втором...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.