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

Заменить мьютекс

25.09.2010, 18:13. Показов 1304. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста как в нижеприведенном коде заменить мьютексы на семафоры, но заставить их работать как мьютексы %) А точнее, нужно заменить конструкцию CreateMutex(NULL, FALSE, NULL); бинарным семафором(насколько я понимаю). Помогите, если не трудно.

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "stdafx.h"
#include <windows.h>
 
HANDLE sem_i, sem_fk;
HANDLE mt;
 
struct MyData
{
    int len;
    char* name; 
};
DWORD WINAPI ThreadProc1( LPVOID arg )
{ 
    MyData* mdp = (MyData*) arg;
    printf("\nStarting process %s\n", mdp->name);
    for (int i = 0; i < mdp->len; i++) {
        printf(mdp->name);
        Sleep(300);
    };
    return 0;
} 
 
DWORD WINAPI ThreadProc2( LPVOID arg )  //Мьютексы
{
    MyData* mdp = (MyData*) arg;
    printf("\nStarting process %s\n", mdp->name);
    WaitForSingleObject(mt, INFINITE);
    for (int i = 0; i < mdp->len; i++) {
        printf(mdp->name);
        Sleep(300);
    };
    ReleaseMutex(mt);
    return 0;
}
 
DWORD WINAPI ThreadProc3( LPVOID arg ) //Семафоры
{
  MyData* mdp = (MyData*) arg;
  printf("\nStarting process %s\n", mdp->name);
  for (int i = 0; i < mdp->len; i++)
  {
      if (mdp->name == "i")
      { 
          WaitForSingleObject(sem_i, INFINITE); 
          printf(mdp->name);
          Sleep(300); 
          ReleaseSemaphore( sem_fk, 1, NULL);
      }; 
 
      if ((mdp->name == "f") || (mdp->name == "k"))
      { 
          WaitForSingleObject(sem_fk, INFINITE); 
          printf(mdp->name);
          Sleep(300); 
          ReleaseSemaphore( sem_i, 1, NULL);
      };
  };
  return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    MyData md[] = { {5, "a"},//0    
    {8, "b"},//1
    {16, "c"},//2
    {21, "d"},//3
    {8, "e"},//4
    {5, "f"},//5
    {28, "g"},//6
    {12, "i"},//7
    {7, "k"},//8
    {13, "m"},//9
    {6, "n"},//10
    };
    HANDLE th_a, th_b, th_c, th_d, th_e, th_f, th_g, th_i, th_k, th_m, th_n;
    
    mt =CreateMutex(NULL, FALSE, NULL);
    
    th_a = CreateThread( NULL, 0, ThreadProc1, &md[0], 0, NULL); 
    WaitForSingleObject(th_a,INFINITE);
    
    th_d = CreateThread( NULL, 0, ThreadProc1, &md[3], 0, NULL); 
    th_c = CreateThread( NULL, 0, ThreadProc2, &md[2], 0, NULL);   //Изменить их на бинарные семафоры
    th_b = CreateThread( NULL, 0, ThreadProc2, &md[1], 0, NULL);   // /-||-/
    th_g = CreateThread( NULL, 0, ThreadProc1, &md[6], 0, NULL);
    
    WaitForSingleObject(th_b,INFINITE);
    th_e = CreateThread( NULL, 0, ThreadProc1, &md[4], 0, NULL);
    WaitForSingleObject(th_e,INFINITE);
     WaitForSingleObject(th_c,INFINITE);
    
        CloseHandle(mt);
    
    sem_i = CreateSemaphore(NULL, 0, 1, NULL);
    sem_fk = CreateSemaphore(NULL, 1, 1, NULL);
    
    th_i = CreateThread( NULL, 0, ThreadProc3, &md[7], 0, NULL);
    th_f = CreateThread( NULL, 0, ThreadProc3, &md[5], 0, NULL); 
    
    WaitForSingleObject(th_f,INFINITE);
    WaitForSingleObject(th_d,INFINITE);
    
    
    th_k = CreateThread( NULL, 0, ThreadProc3, &md[8], 0, NULL);
    th_m = CreateThread( NULL, 0, ThreadProc1, &md[9], 0, NULL);
        
WaitForSingleObject(th_k,INFINITE);
    WaitForSingleObject(th_i,INFINITE);
    WaitForSingleObject(th_g,INFINITE);
    
    th_n = CreateThread( NULL, 0, ThreadProc1, &md[10], 0, NULL);
        WaitForSingleObject(th_m,INFINITE);
    WaitForSingleObject(th_n,INFINITE);
 
 
    CloseHandle(sem_i);
    CloseHandle(sem_fk);
    
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.09.2010, 18:13
Ответы с готовыми решениями:

Мьютекс и синхронизация
Добрый день, пробую создать три потока и мьютекс, два потока заполняют массив из 20 элементов, в начале функций каждого потока они...

Блокировка процессов мьютекс
Как с помощью мьютекса сделать так, чтобы при открытии нескольких одинаковых процессов работал только один а остальные ждали его завершения?

Сторонний процесс не видит мьютекс
Добрый день. Мой процесс, используя манифест, запускается &quot;как от Администратора&quot;. Затем он активирует встроенную админку и запускает...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.09.2010, 18:13
Помогаю со студенческими работами здесь

Как узнать захвачен ли мьютекс
Привет, хочу вывести MessageBox если мьютекс захвачен, как сделать проверку?

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

Можно ли открыть Мьютекс в другом потоке и освободить его ?
Если мы Перевели Мьютекс в НЕсигнальное состояния внутри нашего потока, ТО разлочить этот мьютекс, то есть перевести его в Сигнальное...

Как правильно завершить поток, который лочит мьютекс в цикле?
Есть поток, созданный посредствам CreateThread, который в цикле лочит именной мьютекс, ну типа while(1) { OpenMutex(MUTEX_ALL_ACCESS,...

Мьютекс.
Всем привет! Задача делает, то что требуется, но правильно ли?... то не знаю. Прошу прокомментировать корректность решения задачи. Вот...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru