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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
beginner_29
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 3
#1

Параллельное программирование в С++ - C++

03.07.2013, 11:01. Просмотров 1183. Ответов 10
Метки нет (Все метки)

Здравствуйте! я новичок в параллельном программировании. Помогите пожалуйста с задачкой!! Есть одна глобальная переменная, которая должна модифицироваться двумя потоками. Синхронизировать эти потоки по средствам критической секции. Заранее спасибо)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 11:01     Параллельное программирование в С++
Посмотрите здесь:

параллельное программирование - C++
Подскажите, пожалуйста! Возвожу положительные числа в степень, а выдается отрицательный результат. Как быть? #include <iostream> ...

Параллельное программирование - C++
Кто-нибудь использовал в своей жизни? Если да, то какой? И были ли положительные результаты в плане ускорения? О, да... Может, кто CUDA...

Параллельное программирование - C++
Подскажите, пожалуйста, как в PUTTY начать редактировать файл?

Параллельное программирование на C++ - C++
Вот например происходит какое то действие, это действие длится 5 минут. И вот я запускаю это действие и жду, жду, жду, и тут мне надоело...

Параллельное программирование - C++
Нужно написать простейшую программу для кластера. Читал про MPI, но там тоже есть выбор: из boost-а, OpenMPI, OpenMP, который...

Параллельное программирование - C++
Всем доброго времени суток! Не нашла на сайте ни одной темы с параллельным программированием. Хотела узнать есть ли здесь люди знакомые с...

Параллельное программирование - C++
У меня есть задание: Коллективные операции. Работа имитирует реальный поиск в параллельной базе данных. Некоторое множество записей...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.07.2013, 11:24     Параллельное программирование в С++ #2
Может, std::lock_guard подойдет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <thread>
#include <mutex>
 
int g_i = 0;
std::mutex g_i_mutex;  // protects g_i
 
void safe_increment()
{
    std::lock_guard<std::mutex> lock(g_i_mutex);
    ++g_i;
 
    // g_i_mutex is automatically released when lock
    // goes out of scope
}
 
int main()
{
    std::thread t1(safe_increment);
    std::thread t2(safe_increment);
 
    t1.join();
    t2.join();
}
std::lock_guard
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 12:59     Параллельное программирование в С++ #3
std::lock_guard вроде как в С++11 появился, не все компилляторы это могут поддерживать
Если речь идет об одной переменной типа int, то можно дописать модификатор volatile при ее объявлении, тогда можно обойтись без мьютексов
Если нужно именно через критическую секцию синхронизировать потоки, то довольно подробно об этом написано тут для POISX или тут для windows
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,262
Завершенные тесты: 1
03.07.2013, 13:51     Параллельное программирование в С++ #4
Цитата Сообщение от beginner_29 Посмотреть сообщение
Есть одна глобальная переменная, которая должна модифицироваться двумя потоками.
А чуть подробнее о задаче ? Что именно делают потоки ?

Добавлено через 55 секунд
Цитата Сообщение от Kojt Посмотреть сообщение
Если речь идет об одной переменной типа int, то можно дописать модификатор volatile при ее объявлении, тогда можно обойтись без мьютексов
Это если только чтение-запись. А, например, инкремент переменной уже не будет атомарен,
независимо от volatile, и в этом случае нужна синхронизация.
-=ЮрА=-
Заблокирован
Автор FAQ
03.07.2013, 14:05     Параллельное программирование в С++ #5
beginner_29, доработай по аналогии Как после обработки потока запустить его с новым методом? - яркая модель двух потоков по схеме Производитель-Потребитель
beginner29
Сообщений: n/a
03.07.2013, 14:16     Параллельное программирование в С++ #6
Все равно. Пусть первый поток умножает переменную на 2, а второй поток прибавляет к ней единицу.
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,262
Завершенные тесты: 1
03.07.2013, 14:58     Параллельное программирование в С++ #7
Цитата Сообщение от beginner29 Посмотреть сообщение
Пусть первый поток умножает переменную на 2, а второй поток прибавляет к ней единицу.
Ну так и в чем проблема ? Объявите критическую секцию где-нибудь в глобальном пространстве имен,
проинициализируйте ее с помощью InitializeCriticalSectionAndSpinCount. Потом запустите два потока
через _beginthreadex, первый пускай в цикле выполняет умножение переменной, второй инкремент.
Оба перед обращением к переменной должны звать EnterCriticalSection, а после - LeaveCriticalSection.
А вообще, критическая секция здесь - слишком большая роскошь, из-за высокой конкуренции за
переменную это убъет всю производительность в ноль, потоки будут постоянно ждать друг друга.
beginner_29
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 3
03.07.2013, 21:50  [ТС]     Параллельное программирование в С++ #8
Я попробовала, вот что у меня получилось. Я так понимаю она работает у меня неправильно(
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
29
30
31
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <process.h>
CRITICAL_SECTION cs;
int a;
 
void Thread( void* pParams )
{ 
    while (1)
    { 
        EnterCriticalSection( &cs );
        a++;
        printf("%d", a);
        LeaveCriticalSection( &cs );
    }
}
 
int main( void )
{ 
    InitializeCriticalSection( &cs );
     _beginthread(Thread, 0, NULL);
    while(1)
    {
        EnterCriticalSection( &cs );
        a *=2;
        printf("%d", a);
        LeaveCriticalSection( &cs );
    }
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
03.07.2013, 22:15     Параллельное программирование в С++ #9
beginner_29, я же дал нормальный код с синхрой двух потоков
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
void Producer1(PVOID pvoid)
- получает текущее time_t и переводит его в стрингу
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sprintf(pparams->sProd1ForConsum1,"Produser1->Consumer1 : %s", asctime(localtime(&t)));
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
void Consumer1(PVOID pvoid)
- печатает эту строку
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
printf("%s",pparams->sProd1ForConsum1);
Жаль когда люди не ценят помощи.

Добавлено через 1 минуту
ЗЫ:
Цитата Сообщение от beginner_29 Посмотреть сообщение
int a;
- хотябы в своём коде сделайте
Цитата Сообщение от beginner_29 Посмотреть сообщение
int a = 0;
, потоки что додуматсья должны какая нач инициализация у а?
beginner_29
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 3
03.07.2013, 23:07  [ТС]     Параллельное программирование в С++ #10
спасибо большое)) я же сказал, что новичок=) и пока не до конца понимаю ваш код. Мне бы что по проще для начала)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2013, 23:22     Параллельное программирование в С++
Еще ссылки по теме:

параллельное программирование - C++
Клиент серверное приложение. Суть - в реализации обычного чата. Оба устройства коннекятся через клиент-серверный сокет. Всё работает ок. Но...

Параллельное программирование - C++
Подскажите учебник с помощью которого можно научиться параллельному программированию

Параллельное программирование - C++
Как составить параллельную программу вычисления среднего арифметического элементов вектора?

Многопоточное и параллельное программирование - C++
Уважаемые участники форума! Подскажите, пожалуйста, литературу по многопоточному и параллельному программированию на русском и возможно...

Параллельное программирование + графика - C++
Проблема такая: препод сказал написать программу, где будут два квадрата двигаться туда сюда и что бы их прорисовка, движение и т.д. были...


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

Или воспользуйтесь поиском по форуму:
Taatshi
04.07.2013, 23:22     Параллельное программирование в С++
  #11
 Комментарий модератора 
beginner_29, у нас на форуме клонирование запрещено. Предупреждение.
Yandex
Объявления
04.07.2013, 23:22     Параллельное программирование в С++
Ответ Создать тему
Опции темы

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