С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
1

Синхронизации многопоточности

16.10.2014, 23:37. Показов 2901. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
добрый день, пытаюсь сделать синхронизацию потом на примере producer\consumer, но что-то не выходит, я в consumere сделал ожидания установки сигнала, а в продюсере убрал установку сигнала, но второй потом всеравно выполняется, вот мой код, подскажите может я что нитак понимаю или же где ошибка
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
#include <iostream>
#include <thread>
#include <mutex>
#include <windows.h>
std::mutex mutex;
HANDLE event;
static int g_x=0;
//tread 1
DWORD WINAPI producer(LPVOID param)
{
    for(int i=0;i<100;++i)
    {
        
        {
            mutex.lock();
            g_x=i;        
           // SetEvent(event);
            mutex.unlock();
        }
    }
    return 0;
}
//thread 2
DWORD WINAPI consumer(LPVOID param) 
{
    for(int i=0;i<100;++i)
    {
        if(WaitForSingleObject(event,INFINITE))//тут же по идее потом должен не выполнятся пока не будет установлен event, а он всеравно делается
        {
            std::cout<<g_x<<"\n";
            ResetEvent(event);
        }
    }
    return 0;
}
void main()
{
     DWORD t1;
     DWORD t2;
     CreateThread(NULL, NULL, producer, NULL, NULL, &t1);    
     CreateThread(NULL, NULL, consumer, NULL, NULL, &t2);    
    
    system("pause");
}
Добавлено через 5 минут
чуть подправил код, а что у меня получалось продюсер изменял значения раньше слушателя, но всеравно нефурычит как надо
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
#include <iostream>
#include <thread>
#include <mutex>
#include <windows.h>
std::mutex mutex;
HANDLE event;
HANDLE event2;
static int g_x=0;
//tread 1
DWORD WINAPI producer(LPVOID param)
{
    for(int i=0;i<100;++i)
    {
        if(WaitForSingleObject(event2,INFINITE))
        {
            mutex.lock();
            g_x=i;        
            SetEvent(event);
            ResetEvent(event2);
            mutex.unlock();
        }
    }
    return 0;
}
//thread 2
DWORD WINAPI consumer(LPVOID param) 
{
    for(int i=0;i<100;++i)
    {
        if(WaitForSingleObject(event,INFINITE))//тут же по идее потом должен не выполнятся пока не будет установлен event, а он всеравно делается
        {
            std::cout<<g_x<<"\n";
            ResetEvent(event);
            SetEvent(event2);
        }
    }
    return 0;
}
void main()
{
     DWORD t1;
     DWORD t2;
     CreateThread(NULL, NULL, producer, NULL, NULL, &t1);    
     CreateThread(NULL, NULL, consumer, NULL, NULL, &t2);    
    
    system("pause");
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2014, 23:37
Ответы с готовыми решениями:

О многопоточности
Интересно, стало, а сколько всего потоков я могу открыть в своем проекте, существуют ли какие...

Производительность многопоточности
Доброго времени суток. Решил заняться многопоточностью, и натолкнулся на непонимание с...

изучение многопоточности
с чего стоит начать изучение многопоточности? есть базовые знания по С++, основы ООП. пытался...

Часы многопоточности
Помогите пожалуйста. В проект хочу вставить часы, которые будут показывать часы и...

32
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.10.2014, 23:50 2
Лучший ответ Сообщение было отмечено Avazart как решение

Решение

1. Читайте теорию.
2. Не путайте "код" std и WinApi.
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
16.10.2014, 23:55  [ТС] 3
подскажите хоть в чем конкретно ошибка) в каком направлении копать) а то я уже много чего переделал и всеравно некак нефурычит, то перестает вообще выодит что либо, либо выводит только одиновое число, то 0 то 99,дайте подсказку по данному коду
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
17.10.2014, 00:01 4
здесь может быть уместней не мьютексы а семафоры
первая задача устанавливает семафор и ждет когда он освободится
вторая сбрасывает
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
17.10.2014, 00:05  [ТС] 5
Цитата Сообщение от ValeryS Посмотреть сообщение
здесь может быть уместней не мьютексы а семафоры
я про них еще не читал, незнаю как используются
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
17.10.2014, 00:10 6
грубо говоря, мьютекс блокирует какой то ресурс не дает другому потоку к нему достучатся
возможна такая бяка как взаимная блокировка потоков
а семафор это указатель можно ли обращаться к ресурсам, типа светофора красный ехать(читай обращаться) нельзя зеленый можно

а может тебе вообще очередь нужна? один пишет другой читает
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
17.10.2014, 00:19  [ТС] 7
ну мне надо что бы в продюсере менялось значение, а в слушателе оно выводилось и получалось
0 1 2 3 4 ....
а у меня самое лучше что вышло это
0 0 0... 44 99 99 99
или 0 0 0 0 5 66 99 99 99
и тд
вот коса, кирво по примерам и без понимания семафора пока, набросал кое-что, но как я понял, тут делается не то что мне нужно, а по очереди, второй ждет пока закончится первый и потом запускается, а можно сделать что бы они менялись? какую проверку добавить? и я непонял как сделать что бы один поток отпустил семафор что бы схватил второй, ну пока незакончился цикл
вот код
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
#include "stdafx.h"
#include <iostream>
#include "windows.h"
using namespace std;
static int g_x=0; 
HANDLE h1,h2;
HANDLE sp1; 
DWORD WINAPI Thread1(LPVOID lpParam1)
{
    for (int i=0;i<100;i++)
    {
 
        WaitForSingleObject(sp1,INFINITE);
        g_x=i;
        ReleaseSemaphore(sp1,1,NULL);                     
    }
    return 0;
} 
DWORD WINAPI Thread2(LPVOID lpParam1) 
{
    for (int i=0;i<100;i++)
    {
        WaitForSingleObject(sp1,INFINITE);
        std::cout<<g_x<<"\n";
        ReleaseSemaphore(sp1,1,NULL);       
    }
    return 0;
} 
VOID main()
{
    sp1=CreateSemaphore(NULL,1,1,NULL);
 
    h1 = CreateThread(NULL,0,Thread1,NULL,0,NULL);
    h2 = CreateThread(NULL,0,Thread2,NULL,0,NULL);
    
    system("pause");
}
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
17.10.2014, 00:29 8
Цитата Сообщение от итернал Посмотреть сообщение
а по очереди, второй ждет пока закончится первый и потом запускается,
зачем
принцип очереди первым пришел первым вышел, в отличии от стека первым пришел последним вышел
вот алгоритм

первый поток
1 если очередь не полная пишем значение, идем к 1
2 иначе(очередь полная) ждем пока освободится хоть один элемент
3 идем к 1
второй поток
1 если очередь пуста идти к 1
2 иначе считываем значение
3 идем к 1

запись и чтение в очередь можно запихать в критические секции
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
17.10.2014, 00:34  [ТС] 9
а можно маленький примерчик какой нибуть? буду очень благодарен)
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
17.10.2014, 00:39 10
Цитата Сообщение от итернал Посмотреть сообщение
а можно маленький примерчик какой нибуть?
не сейчас, может быть завтра
у меня на часах полтретьего ночи
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.10.2014, 00:41 11
Определись сначала на чем тебе нужно сделать: стандартными средствами или на WinApi ?
И нормально сформулируй задачу, а то непонятно что требуется и как.
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
17.10.2014, 00:48  [ТС] 12
Цитата Сообщение от Avazart Посмотреть сообщение
Определись сначала на чем тебе нужно сделать: стандартными средствами или на WinApi ?
ну вообще изначально хотелось бы через евент и mutex, то что я посчитал более понятным этот метод, если я правильно понял, то это вы подразумеваете под стандартными средствами) просто я совсем недавно начал это изучать и мне показалось что через них будет легко и просто выполнить поставленную задачу, но как я уже писал в первом посте у меня там неправильно работает или я там от незнания наворотил бог знает что?
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.10.2014, 00:49 13
Цитата Сообщение от итернал Посмотреть сообщение
через евент и mutex,
whoдка?
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
17.10.2014, 00:54  [ТС] 14
я понял, походу от незнания я пишу такую ерунду что наверное даже вникать нехочется, тогда постараюсь сам разобратся, только хоть толкните в нужном направление, что хоть не так в моем коде из первого поста, с чего начать исправлять?
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.10.2014, 00:55 15
Цитата Сообщение от итернал Посмотреть сообщение
толкните в нужном направление
Уже:
Цитата Сообщение от stima Посмотреть сообщение
1. Читайте теорию.
2. Не путайте "код" std и WinApi.
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
17.10.2014, 00:58  [ТС] 16
ех... не сильно помогло
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.10.2014, 01:01 17
Цитата Сообщение от итернал Посмотреть сообщение
ех... не сильно помогло
Можно использовать средства многопоточности из WinApi, а можно из нового стандарта (С++11): Энтони Уильямс "Параллельное программирование на С++ в действии".
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.10.2014, 01:02 18
Цитата Сообщение от итернал Посмотреть сообщение
ех... не сильно помогло

Не по теме:

Ну да читать книги бесполезная трата времени...

0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
17.10.2014, 01:56  [ТС] 19
вот написал, вроде работает как надо, но если не сложно, можно пару советов, ну в плане может что либо по другом стоило сделать или по другому, вот раньше писали про симафоры, щас буду пытатся и в них разобратся, может еще какие будут советы или незнаю способы реализации
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
#include <iostream>
#include <thread>
#include <mutex>
#include <windows.h>
std::mutex mutex;
HANDLE event;
HANDLE event2; 
static int g_x=0;
//tread 1
DWORD WINAPI producer(LPVOID param)
{        
    for(int i=0;i<100;++i)
    {        
        if(WaitForSingleObject(event2,INFINITE)==WAIT_OBJECT_0)
        {
            mutex.lock();
            g_x=i;        
            SetEvent(event);
            ResetEvent(event2);
            mutex.unlock();
        }
    }
    return 0;
}
//thread 2
DWORD WINAPI consumer(LPVOID param) 
{
    for(;;)
    {  
        if(WaitForSingleObject(event,INFINITE)==WAIT_OBJECT_0)//тут же по идее потом должен не выполнятся пока не будет установлен event, а он всеравно делается
        {
            std::cout<<g_x<<"\n";
            ResetEvent(event);
            SetEvent(event2);
        }
    }
    return 0;
}
void main()
{
     DWORD t1;
     DWORD t2;
     event=CreateEvent(NULL,TRUE,FALSE,NULL);
     event2=CreateEvent(NULL,TRUE,TRUE,NULL);
     CreateThread(NULL, NULL, producer, NULL, NULL, &t1);    
     CreateThread(NULL, NULL, consumer, NULL, NULL, &t2);      
}
0
Avazart
17.10.2014, 02:02     Синхронизации многопоточности
  #20

Не по теме:

Код как и прежде редкое не-пойми-что

0
17.10.2014, 02:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2014, 02:02
Помогаю со студенческими работами здесь

Сравнение многопоточности С++11 и WinAPI
У меня скорее теоретический вопрос, чем практический. Есть ли разница работы с многопоточностью в...

Реализация многопоточности в консоли
Доброго времени суток. Не могу разобраться в многопоточности. Реализовано перемещение по меню с...

Подскажите литературу о многопоточности!
Начинал читать QNX/UNIX Анатомия Параллелизма О.Цилюрик Е.Горошко, но там упор делается на QNX......

Управление потоками в многопоточности
вопрос простой: что посоветуете почитать по теме для начинающего? с помощью чего проще...

Теория о многопоточности и многопроцессорности
Ребят, возник вот такой вопрос: в каком случае многопоточность и многопроцессорность не будут...

Реализация многопоточности в GUI приложении
Здравствуйте! Заранее извиняюсь за, возможно, глупые вопросы по поводу этой темы, но они...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru