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

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

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

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DiffEreD
1430 / 767 / 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
0
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 12:59 #3
std::lock_guard вроде как в С++11 появился, не все компилляторы это могут поддерживать
Если речь идет об одной переменной типа int, то можно дописать модификатор volatile при ее объявлении, тогда можно обойтись без мьютексов
Если нужно именно через критическую секцию синхронизировать потоки, то довольно подробно об этом написано тут для POISX или тут для windows
1
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
03.07.2013, 13:51 #4
Цитата Сообщение от beginner_29 Посмотреть сообщение
Есть одна глобальная переменная, которая должна модифицироваться двумя потоками.
А чуть подробнее о задаче ? Что именно делают потоки ?

Добавлено через 55 секунд
Цитата Сообщение от Kojt Посмотреть сообщение
Если речь идет об одной переменной типа int, то можно дописать модификатор volatile при ее объявлении, тогда можно обойтись без мьютексов
Это если только чтение-запись. А, например, инкремент переменной уже не будет атомарен,
независимо от volatile, и в этом случае нужна синхронизация.
1
-=ЮрА=-
Заблокирован
Автор FAQ
03.07.2013, 14:05 #5
beginner_29, доработай по аналогии Как после обработки потока запустить его с новым методом? - яркая модель двух потоков по схеме Производитель-Потребитель
1
beginner29
Сообщений: n/a
03.07.2013, 14:16 #6
Все равно. Пусть первый поток умножает переменную на 2, а второй поток прибавляет к ней единицу.
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
03.07.2013, 14:58 #7
Цитата Сообщение от beginner29 Посмотреть сообщение
Пусть первый поток умножает переменную на 2, а второй поток прибавляет к ней единицу.
Ну так и в чем проблема ? Объявите критическую секцию где-нибудь в глобальном пространстве имен,
проинициализируйте ее с помощью InitializeCriticalSectionAndSpinCount. Потом запустите два потока
через _beginthreadex, первый пускай в цикле выполняет умножение переменной, второй инкремент.
Оба перед обращением к переменной должны звать EnterCriticalSection, а после - LeaveCriticalSection.
А вообще, критическая секция здесь - слишком большая роскошь, из-за высокой конкуренции за
переменную это убъет всю производительность в ноль, потоки будут постоянно ждать друг друга.
2
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;
}
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;
, потоки что додуматсья должны какая нач инициализация у а?
1
beginner_29
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 3
03.07.2013, 23:07  [ТС] #10
спасибо большое)) я же сказал, что новичок=) и пока не до конца понимаю ваш код. Мне бы что по проще для начала)
0
Taatshi
04.07.2013, 23:22     Параллельное программирование в С++
  #11
 Комментарий модератора 
beginner_29, у нас на форуме клонирование запрещено. Предупреждение.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2013, 23:22
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.07.2013, 23:22
Ответ Создать тему
Опции темы

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