Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 1
Регистрация: 01.05.2015
Сообщений: 20

Мьютекс и синхронизация

02.04.2016, 12:28. Показов 2401. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, пробую создать три потока и мьютекс, два потока заполняют массив из 20 элементов, в начале функций каждого потока они захватывают мьютекс, если получится, а после присваивания одному элементу массива значения, отпускают его, т. е. два потока должны вводить элементы массива поочередности, пока он не будет заполнен полностью. Третий поток осуществляет вывод массива на экран, когда два других потока закончат свою работу, но что-то не получается, подскажите, в чем проблема
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
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <fstream>
 
int mass[20];
HANDLE hfirst, hsecond, hthird, hmutex;
int i = 0;
std::fstream file; 
 
DWORD WINAPI ThirdThread(LPVOID param)
{
    if ((WaitForSingleObject(hfirst, INFINITE) == WAIT_OBJECT_0) && (WaitForSingleObject(hsecond, INFINITE) == WAIT_OBJECT_0)) {
        file.close();
        std::cout << "\n\nYour massiv: ";
        for (int j = 1; j <= i; ++j) {
            std::cout << mass[j] << " ";
        }
    }
    return 0;
}
 
DWORD WINAPI SecondThread(LPVOID param)
{
    if (OpenMutex(MUTEX_ALL_ACCESS, TRUE, L"ObjectMutex") == hmutex) {
    ++i;
    mass[i] = i;
    file << mass[i] << " ";
    std::cout << "Second thread works\n";
    ReleaseMutex(hmutex);
    }
    return 0;
}
 
DWORD WINAPI FirstThread(LPVOID param)
{
    while (i < 20) {
        if (OpenMutex(MUTEX_ALL_ACCESS, TRUE, L"ObjectMutex") == hmutex) {
        ++i;
        mass[i] = i;
        file << mass[i] << " ";
        std::cout << "First thread works\n";
        ReleaseMutex(hmutex);
        }
        WaitForSingleObject(hmutex, 5);
    }
    return 0;
}
 
int main()
{
    DWORD first_param, id_first = 1, second_param, id_second = 1, third_param, id_third = 1;
    file.open("text.txt", std::fstream::out);
    std::cout << "Please, click any button to start :)\n";
    getchar();
    hmutex = CreateMutex(NULL, FALSE, L"ObjectMutex");
    hfirst = CreateThread(NULL, 0, FirstThread, &first_param, 0, &id_first);
    hsecond = CreateThread(NULL, 0, SecondThread, &second_param, 0, &id_second);
    hthird = CreateThread(NULL, 0, ThirdThread, &third_param, 0, &id_third);
    getch();
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.04.2016, 12:28
Ответы с готовыми решениями:

Синхронизация службы и клиента через мьютекс
Доброго времени суток, форумчане! Кратко. Есть служба она создаёт мьютекс hMutex = CreateMutex(NULL, FALSE, MutexName); ...

Мьютекс и синхронизация
Разбираюсь с мьютексами и синхронизацией приложений. Создал редактор.В нем есть диалог печати если запущены несколько копий редактора и в...

Синхронизация мьютекс
Привет, на данный момент пытаюсь научиться пользоваться синхронизацией. Есть такой код: #include &lt;iostream&gt; #include...

3
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
02.04.2016, 17:35
Проблема в условиях проверки возврата функции OpenMutex. Вот так работает:
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
DWORD WINAPI FirstThread(LPVOID param)
{
    HANDLE hOpened = NULL;
    while (i < 20) 
    {   hOpened = OpenMutex(MUTEX_ALL_ACCESS, TRUE, L"ObjectMutex");
        if (hOpened != NULL) {
            ++i;
            mass[i] = i;
            file << mass[i] << " ";
            std::cout << "First thread works\n";
            ReleaseMutex(hOpened);
            CloseHandle(hOpened);
        } else WaitForSingleObject(hmutex, INFINITE);
    }
    return 0;
}
DWORD WINAPI SecondThread(LPVOID param)
{
    HANDLE hOpened = NULL;
    while (i < 20) 
    {
        hOpened = OpenMutex(MUTEX_ALL_ACCESS, TRUE, L"ObjectMutex");
        if (hOpened != NULL) {
            ++i;
            mass[i] = i;
            file << mass[i] << " ";
            std::cout << "Second thread works\n";
            ReleaseMutex(hOpened);
            CloseHandle(hOpened);
        } else 
            WaitForSingleObject(hmutex, INFINITE);
    }
    return 0;
}
Но мьютексы чёткую поочередность вызова потоков тебе гарантировать не смогут. Это связано со сложным алгоритмом работы планировщика виндовс. (Подробности в книге М. Руссинович, Д. Соломон "Внутреннее устройство Microsoft Windows"). Если поочередность обязательна, то лучше воспользоваться двумя Event'ами по такой схеме: первый поток, отработав итерацию, ставит свой ивент в несигнальное положение, запускает ивент второго потока и начинает ждать сигнала на своем ивенте. Второй поток делает так же: дождавшись работает, потом сбрасывает свой ивент (ResetEvent), делает SetEvent(первому потоку), и начинает WaitForSingleObject(своего ивента).
0
0 / 0 / 1
Регистрация: 01.05.2015
Сообщений: 20
02.04.2016, 23:34  [ТС]
Спасибо большое)

Добавлено через 1 час 5 минут
Нет, подождите, у меня не работает данный код, потоки и дальше отказываются работать

Добавлено через 2 минуты
OpenMutex отказывается возвращать значение, отличное от нуля
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
03.04.2016, 09:42
У меня так работает:
Вложения
Тип файла: zip testMutex.zip (3.8 Кб, 10 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2016, 09:42
Помогаю со студенческими работами здесь

Синхронизация потоков, мьютекс
я имею функцию, которую запускаю в несколько потоков public static void FuckingThread(StreamWriter kok, Regex RegExp) ...

Мьютекс и синхронизация (с++ builder)
Создал VCL приложение в С++Builder. На нем лежит кнопка вызывающая диалог печати. Вопрос такой как сделать чтобы если запущены несколько...

Модуль EVO II синхронизация 50гц, На какой ножке контроллера синхронизация шим двигателя?
Частый дефект для модулей EVO II с коллекторным двигателем - нет управления двигателем при помехах в сети. Помехи создают диммеры, блоки...

Мьютекс в C++
Здравствуйте! Помогите пожалуйста написать взаимодействие двух процессов(желательно через мьютекс). Одно приложение случайным образом...

Мьютекс
Вобщем если можно напишите как работать с ним: есть 2 формы, одна с заданным интервалом записвает в файл, вторая считывает, и мьютекс...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой
Programma_Boinc 10.04.2026
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой Если на Windows стоит дискретная NVIDIA или AMD — можно отдать её вычислительную мощность реальным исследованиям. . . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru