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

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

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

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

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

Здравствуйте! я новичок в параллельном программировании. Помогите пожалуйста с задачкой!! Есть одна глобальная переменная, которая должна модифицироваться двумя потоками. Синхронизировать эти потоки по средствам критической секции. Заранее спасибо)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1427 / 764 / 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
Убежденный
Системный программист
Эксперт С++
14889 / 6707 / 1059
Регистрация: 02.05.2013
Сообщений: 10,998
Завершенные тесты: 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, а второй поток прибавляет к ней единицу.
Убежденный
Системный программист
Эксперт С++
14889 / 6707 / 1059
Регистрация: 02.05.2013
Сообщений: 10,998
Завершенные тесты: 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     Параллельное программирование в С++
Ответ Создать тему
Опции темы

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