Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 3
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! я новичок в параллельном программировании. Помогите пожалуйста с задачкой!! Есть одна глобальная переменная, которая должна модифицироваться двумя потоками. Синхронизировать эти потоки по средствам критической секции. Заранее спасибо)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2013, 11:01
Ответы с готовыми решениями:

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

Параллельное программирование
Есть задача, которая хорошо распараллеливается. Ее текущий вариант выполняется неприлично долго:...

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

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

10
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 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
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 12:59 3
std::lock_guard вроде как в С++11 появился, не все компилляторы это могут поддерживать
Если речь идет об одной переменной типа int, то можно дописать модификатор volatile при ее объявлении, тогда можно обойтись без мьютексов
Если нужно именно через критическую секцию синхронизировать потоки, то довольно подробно об этом написано тут для POISX или тут для windows
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 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
03.07.2013, 14:16 6
Все равно. Пусть первый поток умножает переменную на 2, а второй поток прибавляет к ней единицу.
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
03.07.2013, 14:58 7
Цитата Сообщение от beginner29 Посмотреть сообщение
Пусть первый поток умножает переменную на 2, а второй поток прибавляет к ней единицу.
Ну так и в чем проблема ? Объявите критическую секцию где-нибудь в глобальном пространстве имен,
проинициализируйте ее с помощью InitializeCriticalSectionAndSpinCount. Потом запустите два потока
через _beginthreadex, первый пускай в цикле выполняет умножение переменной, второй инкремент.
Оба перед обращением к переменной должны звать EnterCriticalSection, а после - LeaveCriticalSection.
А вообще, критическая секция здесь - слишком большая роскошь, из-за высокой конкуренции за
переменную это убъет всю производительность в ноль, потоки будут постоянно ждать друг друга.
2
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
0 / 0 / 0
Регистрация: 03.07.2013
Сообщений: 3
03.07.2013, 23:07  [ТС] 10
спасибо большое)) я же сказал, что новичок=) и пока не до конца понимаю ваш код. Мне бы что по проще для начала)
0
Taatshi
04.07.2013, 23:22     Параллельное программирование в С++
  #11
 Комментарий модератора 
beginner_29, у нас на форуме клонирование запрещено. Предупреждение.
0
04.07.2013, 23:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2013, 23:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Как сделать перенос строки в Bash
bytestream 28.01.2025
При работе с командной оболочкой Bash разработчики часто сталкиваются с необходимостью форматирования текстового вывода, где ключевую роль играет правильное управление переносами строк. Умение. . .
Поиск подстроки в строке с помощью Bash
bytestream 28.01.2025
Поиск подстроки в строке является одной из важных задач в программировании и обработке текстов. Применение такого поиска можно найти в самых разных областях, от анализа данных до разработки. . .
[golang] 169. Majority Element
alhaos 28.01.2025
Тут надо вернуть "мажористый" элемент который встречается в слайсе больше чем в половине случаев. По условиям задачи во входных данных такой элемент обязан присутствовать. / / . . .
Когда лучше использовать LinkedList вместо ArrayList в Java
bytestream 28.01.2025
При разработке Java-приложений выбор правильной структуры данных играет ключевую роль в обеспечении эффективности и производительности программы. ArrayList и LinkedList являются двумя. . .
Какой ответ HTTP лучше использовать: 403 Forbidden или 401 Unauthorized, когда недостаточно прав
bytestream 28.01.2025
В современной веб-разработке правильная обработка ошибок и точное информирование клиентов о статусе их запросов играют критическую роль в создании надежных и безопасных приложений. Особое внимание. . .
Как получить список всех файлов коммита в Git
bytestream 28.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде и других файлах проекта. В основе работы Git лежит концепция коммитов - снимков. . .
Как записать только часть изменений файла в Git
bytestream 28.01.2025
В процессе разработки программного обеспечения часто возникает необходимость сохранить только определенные изменения из множества внесенных правок в файлах. Система контроля версий Git предоставляет. . .
[golang] 80. Remove Duplicates from Sorted Array II
alhaos 28.01.2025
В предоставленном упорядоченном по возрастанию целочисленном слайсе, оставить уникальные элементы полюс один возможный дубликат. Вернуть количество таких элементов. / / . . .
Что такое внедрение зависимостей и для чего оно применяется
bytestream 27.01.2025
В современной разработке программного обеспечения одной из ключевых проблем является управление зависимостями между различными компонентами системы. Внедрение зависимостей (Dependency Injection, DI). . .
Как установить cellpadding и cellspacing в CSS
bytestream 27.01.2025
При создании веб-страниц с табличными данными разработчики часто сталкиваются с необходимостью правильного оформления внутренних и внешних отступов в таблицах. В традиционной разметке HTML для этих. . .
Чем отличаются public, protected, package-private и private в Java
bytestream 27.01.2025
В языке программирования Java механизм модификаторов доступа играет ключевую роль в реализации одного из фундаментальных принципов объектно-ориентированного программирования - инкапсуляции. . . .
Зачем нужно explicit в C++. Преобразование типов
bytestream 27.01.2025
В мире программирования на C++ управление преобразованием типов данных играет crucial роль в создании надежного и безопасного кода. Язык C++ предоставляет множество механизмов для контроля над. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru