Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/65: Рейтинг темы: голосов - 65, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 19

Написать программу, создающую два потока, которые выполняются в одном адресном пространстве (в одном процессе)

17.12.2011, 21:19. Показов 13397. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть задание: Написать программу, создающую два потока, которые выполняются в одном адресном пространстве (в одном процессе). Их разделяемый ресурс - целочисленный массив, который содержит данные совместного использования. Потоки должны обрабатывать массив поочередно. Использовать критическую секцию для синхронизации. Пример обработки массива: нахождение суммы всех элементов, вывод этой суммы на экран и запись её в первый элемент массива.

Есть код:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <windows.h>
#include <stdio.h>
 
CRITICAL_SECTION cs = {0};
int a[]= {1,2,3};
 
 
DWORD WINAPI SUM(LPVOID param)
{
    int i=0;
    int sum;
    while(TRUE)
    {
        EnterCriticalSection(&cs);
        sum = 0;
        for(i=0; i<3; i++)
        {
            sum=sum+a[i];
        }
        a[0]=sum;
       
        LeaveCriticalSection(&cs);
        if (a[0] > 100) return 0;
    }
    return 0;
}
DWORD WINAPI PRINT(LPVOID param)
{
    while (TRUE)
    {
        EnterCriticalSection(&cs);
        printf("%d %d %d \n",a[0],a[1],a[2]);
        LeaveCriticalSection(&cs);
        if (a[0] > 100) return 0;
    }
    return 0;
}
 
int main(void)
{
    HANDLE THR[1];
 
    InitializeCriticalSection(&cs);
 
    THR[0]=CreateThread(NULL, 0, PRINT, NULL , 0, NULL);
    THR[1]=CreateThread(NULL, 0, SUM, NULL, 0, NULL);
 
    WaitForMultipleObjects(2, THR, TRUE, INFINITE);
 
    CloseHandle(THR[0]);
    CloseHandle(THR[1]);
    DeleteCriticalSection(&cs);
 
    getchar();
    return 0;
}
Желаемо, чтобы в итоге выводил нечто вроде:
6 2 3
11 2 3
16 2 3
.........
101 2 3,
а вместо этого:
101 2 3.
Пожалуйста помогите разобраться. Заранее спасибо!

Добавлено через 20 часов 0 минут
Господа, пожалуйста, помощь нужна!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2011, 21:19
Ответы с готовыми решениями:

Где выполняются PHP- скрипты в отдельном адресном пространстве или в адресном пространстве сервера?
Кто знает где выполняются PHP- скрипты в отдельном адресном пространстве или в адресном пространстве сервера?

Массив и структура в одном адресном пространстве
Мне необходимо создать массив и структуру в одном адресном пространстве. То есть, чтобы заполнять его можно было, как структуру, а...

Два потока в одном процессе, конфликт чтения/записи файлов
Пробую вникнуть в многопоточность. Хочу написать программу которая создает два потока, которые открывают метод Reader и метод Writer...

25
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
18.12.2011, 14:28
Студворк — интернет-сервис помощи студентам
В моем коде я вам показал логику работы с критическими секциями для вашего случая,а изменить алгоритм суммирования думаю не должно быть проблемой! Семафор-это объект синхронизации а не блокирующая переменная.
C++
1
2
3
4
...
sum+=ar[i];
..
ar[0]=sum;
1
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 19
18.12.2011, 14:42  [ТС]
lavan, спасибо,все работает!)

Добавлено через 5 минут
но есть почему то, он пропускает первые несколько шагов в принте
как это перебороть?
Для массива:
C++
1
int ar[]={2,5,7,9,3};
Вот такое получил (
http://imglink.ru/pictures/18-... 91f7bb.jpg

Добавлено через 1 минуту
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
32
33
34
35
36
37
38
39
#include<windows.h>
#include<iostream>
using namespace std;
CRITICAL_SECTION cs;
int ar[]={2,5,7,9,3};
int coutn;
void thr();
int main() {
        HANDLE htr;
        DWORD dwId;
        InitializeCriticalSection(&cs);
        htr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thr,NULL,0,&dwId);
        Sleep(70);
        while(true) {
                EnterCriticalSection(&cs);
                for(int i=0;i<5;i++)
                cout<<ar[i]<<" ";
                cout<<endl;
                LeaveCriticalSection(&cs);
                       if(ar[0]>300)break;
                Sleep(70);
        }
         CloseHandle(htr);
         DeleteCriticalSection(&cs);
        cin.get();
        return 0;
}
void thr() {
        while(true) {
        int sum=0;
            EnterCriticalSection(&cs);
                for(int i=0;i<5;i++)
                sum+=ar[i];
                ar[0]=sum;
        LeaveCriticalSection(&cs);
                if(ar[0]>300)break;
                Sleep(70);
    }
}
0
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
18.12.2011, 19:56
я думаю,что это происходит из-за этой проверки

Цитата Сообщение от final_sleep Посмотреть сообщение
if(ar[0]>300)break;
Sleep(70);
здесь возможно происходит следущее:1-й поток вышел из критич секции 2-ой поток сразу зашел в крит секцию и после того как он ее освободил мы ожидаем что первый поток стоит в while,а он находится на проверочном условии,за время проверки условия в первом потоке истекает sleep во втором потоке а первый поток вызывает свой sleep и второй поток сново входит в крит секцию.я бы перенес условие выхода в while(условие)
1
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 19
18.12.2011, 20:42  [ТС]
проблема увы осталась ( иногда пропускает первые два вывода суммы, то есть:
26 5 7 9 3
74 5 7 9 3
97 5 7 9 3
122 5 7 9 3
170 5 7 9 3
стабильно хоть где то да пропустит
может увеличить sleep?


увеличение sleep, не очень помогло, думается мне надо блокирующую переменную ввести и дел с концом.

Ввел переменную - все как надо, может действительно не заниматься буквоедством? Критическую секцию использовали? - Использовали!
0
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
18.12.2011, 20:55
решать вам,но может стоит проверочное условие внести в секцию и если усовие выполняется освобождать кр секцию и брик
1
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 19
19.12.2011, 00:56  [ТС]
попробовал. не получилось. остановился на семафорах!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2011, 00:56

Как заставить процесс всегда запускаться в одном и том же адресном пространстве?
Дано: трейдерская программа типа форекс, с кучей ехе и dll, в реальном времени получает с нета данные(цены), на основе них рисует графики. ...

Два приложение на одном процессе
Ситуация такова запущен процесс, а от него два консольных окна как можно узнать запущено ли 1 и 2 приложение, с одним приложением делал...

Два сайта на одном движке на одном хостинге
Доброго времени суток! В наличии: – Хостинг (русоникс) с директориями /var/www/vhosts/two.ru/two (/two) и /var/www/vhosts/two.ru/one...

Как сделать несколько функций в одном срр ?Написал программы, которые нужно поочередно запустить в одном срр
#include &lt;iostream&gt; void func(double&amp; x,double&amp; y) { double temp_min = (x + y) / 2.0;; if(x == std::min(x,y)) { ...

Даны два предложения. Напечатать слова, которые есть только в одном!
Даны два предложения. Напечатать слова, которые есть только в одном! Из них (из них в том числе повторяющиеся)


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru