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

C++

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

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

04.07.2011, 06:48. Просмотров 1430. Ответов 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 минуту
Решение задачи реализовал за счет эвентов, но все равно буду рад услышать что не так с критическими секциями.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2011, 06:48     CRITICAL_SECTION 2 потока
Посмотрите здесь:

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

CRITICAL_SECTION (необходимо исправить ошибки кода) - C++ WinAPI
Имеется код. Помогите исправить ошибку. #include <windows.h> #include <iostream> using namespace std; CRITICAL_SECTION cs; ...

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

ShowModal из потока - C++ Builder
Помогите, пожалуйста: Form2->ShowModal(); в void __fastcall ReadThread::Printing() {

Вызов потока - C++ WinAPI
Результат всегда возвращает 1. как исправить? сервер #include <iostream> #include <winsock2.h> #include <stdio.h> #include...

Закрытие потока - C++
Всем привет! Знает ли кто-нибудь есть ли в С++ "метод закрытия потока" (с) os.close()? Не могу найти, да и в программе компилятор не...

Приоритет потока - C++ WinAPI
Создать приложение, запускающее три дочерних потока. Каждый поток выполняет вывод сообщения о том, что он создан, а затем выводит цифры...

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

Вызов потока - C++ WinAPI
При вызове потока CreateThread на экране отображаются кракозябры. Как исправить? (Для отладки необходимо запустить два проекта, сначала...

Создание потока - C++
Доброй всем ночи! Перерыскал cplusplus.com, но так и не разобрался. Может ли кто-нибудь подсказать, как создать поток, который бы...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
04.07.2011, 22:00     CRITICAL_SECTION 2 потока #2
А зачем нужны потоки, которые работают не одновременно, а по очереди?
QenT
37 / 37 / 1
Регистрация: 29.01.2009
Сообщений: 244
04.07.2011, 22:32  [ТС]     CRITICAL_SECTION 2 потока #3
это абстрактная задача, для лучшего понимания потоков, а вообще как вариант два потока должны заниматься своими вычислениями, а выводить на экран только последовательно.
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
04.07.2011, 23:03     CRITICAL_SECTION 2 потока #4
Цитата Сообщение от QenT Посмотреть сообщение
это абстрактная задача, для лучшего понимания потоков, а вообще как вариант два потока должны заниматься своими вычислениями, а выводить на экран только последовательно.
это абсурдная задача, заставлять два потока работать по очереди
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++
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 потока
Ответ Создать тему
Опции темы

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