- •Задания для подготовки к экзамену по сппо
- •1. Проблема взаимного исключения: программные методы решения
- •3. Проблема взаимного исключения: использование семафоров
- •Решение:
- •Решение:
- •2. Проблема взаимного исключения и тупика: анализ состояний системы для выявления тупиков
- •3. Прерывания и структурная схема обработки исключений:
- •4. Задачи по теме в-деревья:
3. Прерывания и структурная схема обработки исключений:
При выполнении программы произошло исключение. Какое значение получит переменная I после выполнения данного фрагмента программы (примеры 1 и 2) при условии, что I изменяется только в указанных операторах, и для данного исключения:
1. Значение выражения Filter1 = EXCEPTION_CONTINUE_SEARCH
Значение выражения Filter2 = EXCEPTION_CONTINUE_SEARCH
Значение выражения Filter3 = EXCEPTION_EXECUTE_HANDLE
2. Значение выражения Filter1 = EXCEPTION_CONTINUE_SEARCH
Значение выражения Filter2 = EXCEPTION_CONTINUE_SEARCH
Значение выражения Filter3 = EXCEPTION_CONTINUE_EXECUTION
3. Значение выражения Filter1 = EXCEPTION_CONTINUE_SEARCH
Значение выражения Filter2 = EXCEPTION_CONTINUE_EXECUTION
Значение выражения Filter3 = EXCEPTION_EXECUTE_HANDLE
4. Значение выражения Filter1 = EXCEPTION_CONTINUE_SEARCH
Значение выражения Filter2 = EXCEPTION_EXECUTE_HANDLE
Значение выражения Filter3 = EXCEPTION_CONTINUE_EXECUTION
(Символом отмечено место в программе, где произошло исключение)
Пример 1.
__try { ........ I = 0 ; ............
__try { ........ I = I + 1 ; ............
__try { ........ I = I + 2 ; ............
__try { ........ I = I + 3 ; ............
__try { .... .... I = I + 4 ; ............ }
__except ( Filter1 ){ .... I = 0; ..... }
__finally { ..... I = I - 3 ; ..... }
__except (Filter2 ) { .... I = 100; .... }
__finally { ..... I = I - 1 ; ..... }
__except (Filter3 ) { .... I = 200; .... }
....... I = ?
Пример 2.
__try { ........ I = 0 ; ............
__try { ........ I = I + 1 ; ............
__try { ........ I = I + 2 ; ............
__try { ........ I = I + 3 ; ..... .....
__try { .... I = I + 4 ; ......
__try {…}
__finally { … I= 1000; }
}
__except ( Filter1 ){ .... I = 0; ..... }
__finally { ..... I = I – 3 ; ..... }
__except (Filter2 ) { .... I = 100; .... }
__finally { ..... I = I – 1 ; ..... }
__except (Filter3 ) { .... I = 200; .... }
....... I = ?
Что явится результатом выполнения этой функции:
DWORD FuncCounter(void)
{ DWORD dwTemp = 0;
while (dwTemp < 10)
{
__try
{ if (dwTemp == 2)
continue;
if (dwTemp == 3)
break;
}
__finally
{ dwTemp ++; }
dwTemp ++;
}
dwTemp +=10;
return (dwTemp);
}
DWORD FuncExm (void)
{ DWORD dwTemp = 0;
......................................................................
__try
{
WaitForSingleObject (g_hSem, INFINITE) ;
g_dwProtectedData = 5 ;
dwTemp = g_dwProtectedData ;
return (dwTemp);
}
__finally
{
dwTemp = g_dwProtectedData + 100 ;
ReleaseSemaphore (g_hSem, 1, NULL) ;
return (dwTemp) ;
}
dwTemp = 100 ;
return (dwTemp);
}
void ExceptFun (void)
{ int x = 0;
char * lpBuffer = NULL ;
__try {
* lpBuffer = ‘A’ ;
x = 100 / x ;
}
__except (ExceptFilter(&lpBuffer)) {
MessageBox(NULL, “An Exception occurred”, NULL, MB_OK) ;
}
MessageBox(NULL, “Function completed”, NULL, MB_OK) ;
}
LONG ExceptFilter (char **lplpBuffer) {
if (* lplpBuffer == NULL)
{ * lplpBuffer = g_szBuffer ; // Global buffer pointer
return (EXCEPTION_CONTINUE_EXECUTION) ;
}
return (EXCEPTION_EXECUTE_HANDLER) ;
}
void ExceptFun (void)
{ int x = 0;
char * lpBuffer = NULL ;
__try {
* lpBuffer = ‘A’ ;
x = 100 / x ;
}
__except (ExceptFilter(&lpBuffer)) {
MessageBox(NULL, “An Exception occurred”, NULL, MB_OK) ;
}
MessageBox(NULL, “Function completed”, NULL, MB_OK) ;
}
LONG ExceptFilter (char **lplpBuffer) {
if (* lplpBuffer == NULL)
{ * lplpBuffer = g_szBuffer ; // Global buffer pointer
}
return (EXCEPTION_EXECUTE_HANDLER) ;
}