Semaphore проблем на синхронизиране на достъп до споделени ресурси

Кратко описание на програмата:

Под Въведете броя на конци - това ще бъде като набор от споделени ресурси. Flow може да се управлява от прозореца на програмата, като натиснете бутона, но, ако в този момент не е свободен поток от предварително определена сума не е, тогава спирката на операция за освобождаване на семафора.

Засегнатите теми: създаване на процеси, създаване на семафор организация едновременен достъп до споделени ресурси (в случая, където има няколко подобни ресурси и достъп, необходими за всяка една от тях), да изчакат-функции, които изпращат съобщения от потока.

Описание на функции:

Тази функция се създава или се отваря семафор. Тя може да бъде назован или неназован, в зависимост от необходимостта.

МАНИПУЛАЦИИ CreateSemaphore (
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // Качества защита
LONG lInitialCount, // Броят на свободните ресурси на инициализация
LONG lMaximumCount, // Общо ресурси
LPCTSTR lpName // Име
);

typedef структура _SECURITY_ATTRIBUTES <
DWORD nLength; // размер структура (обикновено взети sizeof)
LPVOID lpSecurityDescriptor; // указател към дръжка, която контролира ставата
// използване на съоръжението
BOOL bInheritHandle; // Флаг да се даде възможност да наследи дете процес обект
> SECURITY_ATTRIBUTES, * PSECURITY_ATTRIBUTES;

lInitialCount - Това е броят на наличните ресурси за създаване на семафор. Ако зададете този параметър 0, първоначалното състояние на семафора не е знак, т.е. изчакайте функция ще спре потока до семафор ще сигнализира състояние.
lMaximumCount - Това уточнява разпределението на колко ресурси се нуждаем, за да се следи. Параметър IInitialCount не mozhut надвишава броя, посочен тук.

Повече информация ще намерите на MSDN.

Както се използват в тази програма:

GetDlgItemText (IDC_EDIT1, strThreads); // Получаване на броя на конци
m_iCount = atoi (strThreads); // Да се ​​съхранява в променлива член на клас
// (не забравяйте да го декларира в з-файл
m_hSemaphore = CreateSemaphore (NULL, m_iCount, m_iCount, NULL); // Създаване на семафор за нашия количество ресурси

Тази функция отменя изпълнението на текущия ток, докато каза параметри в своето ядро ​​не идват на състоянието на обекта сигнал (също излизане от изчакване). Ograninicheniya използва за достъп до споделени ресурси. Параметър е често събитие, семафор или мутекс, но също така и като параметър може да бъде уведомяване (нотификация), самият процес и някои други обекти. Върнатата стойност показва, че е на изхода от функцията. Това може да се WAIT_ABANDONED (специфична стойност, върната в случай, че потокът е пълна, притежаване на мутекс), WAIT_OBJECT_0 (обект се сигнализира - в този случай, функцията го поставя себе си в не-сигнализира и семафор увеличава брояч брой заети ресурси), WAIT_TIMEOUT (функция от изчакване).

DWORD WaitForSingleObject (
МАНИПУЛАЦИИ hHandle, // управлява обектът ядрото сигнализира, че интересът ни
DWORD dwMilliseconds // за изчакване, след което прекъсва чака
);

Нека разгледаме някои от параметрите на функцията:
dwMilliseconds - тук можете да посочвате всеки желан момент навън, в допълнение, ако посочите 0, функцията връща потока на контрол веднага (за да можете да проверите състоянието на обекта) и ако посочите БЕЗКРАЙНА постоянна. функция не се вземат под внимание времето и да чака само сигналът за състоянието на ядрото на обекта.

Повече информация ще намерите на MSDN.

Както се използват в тази програма:

WaitForSingleObject (m_hSemaphore, безкрайност); // С натискане на бутон чакането, докато семафор
// няма да бъде свободен (т.е., докато най-малко един от ресурсите не са налични)
Int iRecourceID = 0;
за (INT I = 0; и // (стойност подходящ масив елемент да бъде 0)
ако (m_pBusyResources [Ь] == 0)
m_pBusyResources [iRecourceID] = 1; // Марк ресурса като зает

Тази функция ви позволява да кажете на семафора да освободи едно или повече ресурси. Върнатата стойност е успешна операция.

BOOL ReleaseSemaphore (
ДРЪЖКА hSemaphore, // Дръжка за семафор
LONG lReleaseCount, // брой освободени ресурси
LPLONG lpPreviousCount // Предишна стойност на семафор тезгяха
);

Нека разгледаме някои от параметрите на функцията:
lpPreviousCount - възстановява опция, където можете да получите стойността на семафор гишето за функцията на действие. Ако е необходимо, тази информация не е на разположение, peredaom NULL.

Повече информация ще намерите на MSDN.

Както се използват в тази програма:

DWORD WinAPI WorkThread (невалидни * pParam) // работния процес
Sleep (5000); // "Заспивам"
PostMessage (g_hWnd, WM_FINISH, (WPARAM) pParam, 0);
// Изпрати съобщение за завършване на потока
ReleaseSemaphore (m_hSemaphore, 1, NULL); // Освободете семафор
връщане 0;
>

Нека разгледаме някои от параметрите на функцията:
lpStartAddress - показалка, за да започнете функцията на потока (например името му), който трябва да бъде обявен в рамките на заявлението. Тя трябва да има определен тип:

DWORD WinAPI ThreadProc (// име функция може да бъде произволно
LPVOID lpParameter
);

lpParameter - параметър предава изходния поток функция. Ако една нишка трябва да премине няколко параметъра, трябва или да използвате глобални променливи, или да обяви структура с всички необходими данни и да изпращат него.
dwCreationFlags - обикновено този параметър се използва за обозначаване дали да започне потока веднага след създаването или на повикване ResumeThread функция (в първия случай, параметърът предаване може да бъде 0, във втория - CREATE_SUSPENDED флаг).
lpThreadId - връщане параметър - ID поток, който понякога може да бъде полезен (например, ако съобщение ще бъде изпратено преди). Ако не е необходим номер, можете да мине NULL.

Повече информация ще намерите на MSDN.

Както се използват в тази програма:

CloseHandle (CreateThread (NULL, 0, WorkThread, (нищожен *) iRecourceID, 0, dwID)); // Създаване на поток и веднага близо то ЕВРОВОК, защото ние не се нуждаем

Функция изпраща съобщение асинхронно определен прозорец, т.е. го връща веднага (без да се чака съобщение да бъдат обработени). В прозореца, който изпраща съобщение за подходящи манипулатор и идентификатор съобщение трябва да бъде обявено в програмата.

BOOL PostMessage (
HWND hWnd, // прозорец HWND
UINT Msg, // ID съобщението
WPARAM wParam, // параметър предава на водача
LPARAM lParam // параметър предава на водача
);

Нека разгледаме някои от параметрите на функцията:
hWnd - прозорец HWND, който изпраща съобщение. Тази стойност може да бъде сънливост от класа на прозореца - тя се съхранява в поле m_hWnd.
Msg - идентификатор на съобщение, ако съобщението на потребителя, че е необходимо да декларират ID с помощта на директивата за дефиниране (стойността трябва да започва с WM_USER).
wParam, lParam - параметрите които да се предадат на функцията за манипулатор на съобщението. Като цяло, можете да добавите свой собствен съобщение в картата на съобщението и се асоциира с определен тип манипулатор функция:

LRESULT MessageProc (
WPARAM wParam,
LPARAM lParam
);

Повече информация ще намерите на MSDN.

Както се използват в тази програма:

# определят WM_FINISH (WM_USER + 1)
//.
BEGIN_MESSAGE_MAP (CPrioritiesDlg, CDialog)
//.
ON_MESSAGE (WM_FINISH, OnThreadFinish) // Добавете съобщение във вашата карта съобщение
END_MESSAGE_MAP ()
//.
PostMessage (g_hWnd, WM_FINISH, (WPARAM) iCounter, (LPARAM) GetThreadPriority (GetCurrentThread ()));
//.
LRESULT CPrioritiesDlg :: OnThreadFinish (WPARAM wParam, LPARAM lParam)
// Функция за манипулатори на съобщения (обявен в класа на прозореца в з-файл)
//.
връщане 0;
>