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

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

Войти
Регистрация
Восстановить пароль
 
i7otep9wka
1 / 1 / 1
Регистрация: 13.12.2011
Сообщений: 81
#1

Синхронизация семафорами+ общая память - C++

24.05.2014, 00:07. Просмотров 157. Ответов 0
Метки нет (Все метки)

3 потока. Синхронизация с помощью семафоров. Используется общая память.

Вопрос состоит в том, как определить количество байт, нужных для выделения в общей памяти? Размер вектора у нас изменяется после инициализации указателя *a


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
//verctor with our calculaded sums of equal elements
//we`re finding our first&last max elements for rows and columns
void calc_res_v (vector <int> v_res,const char *type){ 
    vector<int> temp;   
    vector<int>::iterator it = find(begin(v_res),end(v_res), *max_element( v_res.begin(),v_res.end() ) );   
    cout <<"number of 1st "<< type << " is: " << (it-v_res.begin()+1) << endl;  
    for (int i=(v_res.size()-1);i!=-1;i--){
        temp.push_back (v_res.at(i));
    }
    it = find(begin(temp),end(temp), *max_element( v_res.begin(),v_res.end() ) );   
    cout <<"number of last "<< type << " is: " << (it-temp.begin()+1) << endl;
}
 
//sorting row`s elements for calc_elem;; (we`re using temp vec to avoid changes, also may used without "&" and "tmp_v" )
void calc_row(vector< vector<double> >  &matrix, vector <int>  &v_elem){
//  vector <int> v_elem;
    for (auto& i : matrix){
        int elem = 0;
        vector<double> tmp_v;                   
        tmp_v=i;                            //copy vector i>>temp
        sort( tmp_v.begin(),tmp_v.end() );              // sort                         
        calc_elem( elem , tmp_v );
        v_elem.push_back (elem);
    }
}
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
int main(){
  vector< vector<double> > matrix(N,vector<double>(M));
  timespec start, stop;
 
  sem_t *s1 = (sem_t *)mmap(NULL,sizeof(sem_t), PROT_READ | PROT_WRITE , MAP_SHARED | MAP_ANON, -1, 0);
  sem_t *s2 = (sem_t *)mmap(NULL,sizeof(sem_t), PROT_READ | PROT_WRITE , MAP_SHARED | MAP_ANON, -1, 0);
  vector<int> *a = (vector<int> *)mmap(NULL,sizeof(vector<int>), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1,0);
  sem_init(s1, 1, 1);
  sem_init(s2, 1, 1);    
  inp(matrix);
  clock_gettime(CLOCK_MONOTONIC, &start);
 
  if (fork()){
        //calc rows
        sem_wait(s1);
        calc_row(matrix,*a);
        sem_post(s1);
  }else{    
    if(fork()){
        //calc cols
        sem_wait(s2);
        calc_col(matrix,*a);
        sem_post(s2);
    }else{
        //out
        sem_wait(s1);
        calc_res_v (*a, "row");
        sem_wait(s2);       
        calc_res_v (*a, "coll");            
        munmap (a,sizeof(vector<int>));
        munmap (s1,sizeof(sem_t));
        munmap (s2,sizeof(sem_t));
        clock_gettime(CLOCK_MONOTONIC, &stop);
        double d_start = start.tv_sec + start.tv_nsec/1e9;
        double d_stop = stop.tv_sec + stop.tv_nsec/1e9;
        cout << "wall time: " << d_stop -d_start <<endl;
 
        // out(matrix);  
        return 0;  
    }
  }
}
Добавлено через 7 минут
4 процесса*
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2014, 00:07     Синхронизация семафорами+ общая память
Посмотрите здесь:

Пул потоков с семафорами - C++
Задача:написать свой пуль потоков Написал вот такой код #include &lt;windows.h&gt; #include &quot;Worker.h&quot; #include&lt;list&gt; class...

Написать программу с семафорами которая входит в критическую секцию - C++
На дом задали такую домашку &quot;написать программу с семафорами которая входит в критическую секцию&quot;. Препод сказал по своему желанию её...

Теория, Общая - C++
Добрый день! На днях видел в этой ветке в примере кода на С цикл такого вида: for (unsigned int i=0; i&lt;10;++i) {...} Это...

Статическая память,Динамическая память. - C++
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

Наибольшая общая подстрока - C++
Люди из раздела &quot;алгоритмы&quot; молчат.. спрошу тут..Прошу прощения за &quot;флуд&quot;. На днях отправил резюме в Яндекс. Откуда мне прислали...

Задача «Общая подпоследовательность» - C++
Добрый день. Имеется, с виду, тривиальная задача. Напрягает только то, что даны три последовательности. Условие Даны три...

общая структура функции на С++ - C++
Как выглядит общая структура функции на С++?

Общая программа по матрицам - C++
class Matrix { public: double **matrix; int row; //Кол-во строк int col; //Кол-во столбцов Matrix(int m, int...

Общая ф-ция для классов - C++
Функцию, например, MyFunck мне нужно использовать в нескольких классах. Но объявлять и описывать ее заново в каждом классе не хочется. ...

Общая точка(и) пересечения 2 окружностей - C++
Заданы две окружности: с центром в точке О(x0, y0) и радиусом R0 и с центром в точке О(x1, y1) и радиусом R1. Определите, во скольких...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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