IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Синхронизация работы процессов в Windows, C++
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Доброго времени суток! Мне нужно реализовать мьютекс, событие и семафор, по заданию. С мьютексом и событием я вроде бы разобрался и выполнил, а вот на семафоре застопорился, на то он и семафор..наверное))
Вообщем, помогите мне пожалуйста с его реализацией!... какой-нибудь рабочий примерчик тоже сойдёт)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
А вот как это всё применить для решения конкретной задачи?
Вот так, примерно:
#include <iostream>
#include <windows.h>

using namespace std;

LONG maxPlaces = 4;
const int maxCars = 50;

HANDLE hSemaphore;
HANDLE carHandles[maxCars];
int carIDs[maxCars];


DWORD CarThread(int *p)
{
char s[256] = {0};
sprintf(s, "Car #%d test...\n", *p);
cout << s;

// Проверяем состояние семафора
DWORD dwResult = WaitForSingleObject(hSemaphore, 0L);
switch(dwResult) {
case WAIT_OBJECT_0:
// Место есть, заправляемся
sprintf(s, "Car #%d is fuelling...\n", *p);
cout << s;

DWORD fuel_time = (rand() % 3000) + 1000; // Время заправки
Sleep(fuel_time);
ReleaseSemaphore(hSemaphore, 1, NULL); // Освободим семафор
break;

case WAIT_TIMEOUT:
// Семафор занят, проезжаем мимо ...
sprintf(s, "Car #%d: no empty places...\n", *p);
cout << s;
break;
}
return 0;
}

int main()
{
// Инициализируем ГСЧ
srand(time(NULL));

if(hSemaphore = CreateSemaphore(NULL, maxPlaces, maxPlaces, NULL)) {
for(int i = 0; i < maxCars; i++) {
carIDs[i] = i+1;
carHandles[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CarThread,
&carIDs[i], 0, NULL);

DWORD wait_time = 200; // (rand() % 1000) + 1000;
Sleep(wait_time);
}

// Ждем завершения всех тредов ...
WaitForMultipleObjects(maxCars, carHandles, TRUE, INFINITE);
// ... и только потом удаляем семафор
CloseHandle(hSemaphore);
}
// Создать семафор не удалось
else cout << "Cannot create semaphore" << endl;

return 0;
}
Ну, подсчет проехавших мимо машин добавишь сам, основная идея должна быть понятна...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 19:59
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name