Форум программистов, компьютерный форум, киберфорум
Наши страницы
С под Linux
Войти
Регистрация
Восстановить пароль
 
Danilashkirdow
0 / 0 / 0
Регистрация: 28.02.2016
Сообщений: 5
1

Синхронизация потоков для вычисления дисперсии

23.10.2017, 19:34. Просмотров 286. Ответов 1

Доброго времени суток.
Необходима помощь с решением задачи. Задача состоит в следующем:
1. Есть выражение (в моем случае это вычисление дисперсии(http://www.cyberforum.ru/cgi-bin/latex.cgi?\sigma =\frac{1}{2}\sum_{i=1}^{3} {(x[i]-\bar{x})}^{2}, где http://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{x}=\frac{1}{3}\sum_{i=1}^{3}\, \; {x}_{i}). Т.е сначала идет сумма, потом деление, потом разность, потом возведение разностей в квадраты, сумма этих разностей,деление суммы).
2. Необходимо вычислить это выражение с помощью многопоточности, а именно, чтобы один поток выполнял, допустим, сложение, другой умножение, третий вычитание, четвертый деление,пятый возведение в квадрат.
3. Синхронизировать это дело с помощью мьютексов. Т.е. выполнить правильную последовательность действий в выражении.
4. Реализовать способ передачи данных между потоками с помощью очередей сообщений (msgbuf )

Все что я, к сожалению смог осилить, даже после прочтения многих источников, это потоки. Как работают мьютексы до сих пор не понимаю. Вот по идее код. В него надо бы(я считаю) добавить мьютексы да передачу сообщений.

Буду благодарен за помощь. Желательно подробную.

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 
#include <pthread.h> 
#include <unistd.h> 
#include <math.h>
 
 
    pthread_mutex_t mutex; //также я не понимаю сколько мьютексов должно быть
 
void *Addition() 
    {       
        while(1) 
            {    
                //mutex + вычисление сложения
                //вычисление суммы в правом выражении
                sum1=x1+x2+x3;
                //вычисление суммы в левом выражении
                sum2=pow1+pow2+pow3;
                
            }
    } 
 
void *Subtraction()
    {  
 
        while(1)  
            {  
                //mutex + вычисление разности
                //вычисление разности в скобках в левом выражении
                sum3=x1-xx;
                sum4=x2-xx;
                sum5=x3-xx;
            } 
    } 
 void *Division()
    {  
 
        while(1)  
            {  
                //mutex + вычисление деления
                //х среднее в правом выражении
                xx=sum1/3;
                //вычисление финальной сигмы в левом выражении
                sigma=sum2/2;
            } 
    } 
 void *Squaring()
    {  
 
        while(1)  
            {  
                //mutex + вычисление квадрата
                pow1=pow(sum3,2);
                pow2=pow(sum4,2);
                pow3=pow(sum5,2);
            } 
    } 
 
int main()
    {  
        pthread_t thread1, thread2, thread3, thread4; 
        pthread_mutex_init(&mutex, NULL); // также не знаю сколько мьютексов должно быть
        pthread_create(&thread1, NULL, &Addition, NULL); 
        pthread_create(&thread2, NULL, &Subtraction, NULL); 
        pthread_create(&thread3, NULL, &Division, NULL); 
        pthread_create(&thread4, NULL, &Squaring, NULL); 
        sleep(1);   
        pthread_cancel(thread1); 
        pthread_cancel(thread2); 
        pthread_cancel(thread3); 
        pthread_cancel(thread4); 
    }
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2017, 19:34
Ответы с готовыми решениями:

Синхронизация потоков в OC Linux
Здравствуйте. Помогите, пожалуйста, решить проблему. Решите классическую проблему «поставщик –...

Синхронизация потоков, thread-safe usleep
Постановка задачи: Создать 2N+1 потоков. N потоков пишут в общий буфер (далее ОБ), N + 1 потоков...

Синхронизация потоков - найти ошибку в коде
не получается разрулить следующую ситуацию. дано: переменная. 2 треда. 1 поток рулит...

Синхронизация потоков без использования mutex
Была написана прога (в целях лабораторной работы) синхронизации потоков,на защиту дали переделать...

Синхронизация потоков на элементарном уровне (переключение потоков)
в общем разбираюсь с потоками, на сколько понял мне нужен lock Вот имеется просто пример ...

1
peter_irich
74 / 68 / 21
Регистрация: 18.10.2017
Сообщений: 637
23.10.2017, 22:21 2
Когда мне когда-то потребовалось всему этому научиться, я взял книгу "Системное программирование в UNIX",
Кейт Хэвиленд, Файна Грэй, Бан Салама, ДМК, 2000г. и всё получилось. Найдите хорошую книгу
и делайте по образцу, а на форуме могут ответить на конкретный вопрос. Сейчас я попытаюсь приложить
одну из тех программ с примером потока. Вроде бы получилось загрузить zip. Странно, что не принимаются gz.
0
Вложения
Тип файла: zip cntrl6.zip (2.0 Кб, 3 просмотров)
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2017, 22:21

Синхронизация потоков: проблема гонки потоков
Есть проблема в синхронизации потоков, которую я не знаю, как решить. Точнее у меня получается...

Синхронизация потоков
Есть класс class CFrameBufferObserver : public VsCoreLib::IFrameBufferObserver { ...

Синхронизация потоков с++
Реализовать модуль создающий 4 балансировочных потока обеспечивающий 100% загрузку CPU (A,B,C,D)....


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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