Có bác nào làm bài này rùi chỉ cho e cái hướng đi cái.
Nội dung bài đó như sau:
a./ Giải thuật tranh chấp – đồng bộ
Thực hành: Giải thuật Bakery được cung cấp với source code bakery.c, bakery.h. Sinh
viên tạo một project hiện thực sử dụng giải thuật này trong việc giải quyết tranh chấp
giữa các thread. Thread thứ nhất sẽ tăng một biến count, 2 thread còn lại sẽ giảm biến
count này. So sánh nó với trường hợp không sử dụng giải thuật tranh chấp này.
Thread function
{
Do {
// Xin vào vùng tranh chấp
EnterCriticalSection();
If thread id là 1 then
Tăng biến count
Else
Giảm biến count
// Trả lại vùng tranh chấp
LeaveCriticalSection();
While (1)
}
Source code được thêm vào như sau: thêm 2 file bakery.c và bakery.h
bakery.c:
PHP Code:
/* AP 18-apr-05 bakery.c */
/* an implementation of critical */
/* sections based on bakery algorithm */
# include "bakery.h"
# include <stdio.h>
# include <stdlib.h>
# include <windows.h>
# define MAX_THREAD 1024
struct _crit_sec {
volatile int choosing[MAX_THREAD];
volatile int number[MAX_THREAD];
};
void My_InitializeCriticalSection( MY_LPCRITICAL_SECTION * sec ) {
int i;
*sec = (MY_LPCRITICAL_SECTION) malloc (sizeof(struct _crit_sec));
for(i=0; i<MAX_THREAD; i++) {
(*sec)->choosing[i] = 0;
(*sec)->number[i] = 0;
}
}
void My_DeleteCriticalSection( MY_LPCRITICAL_SECTION sec ) {
if (sec) free( sec );
}
void My_EnterCriticalSection( int myId, MY_LPCRITICAL_SECTION sec ) {
int max, j;
sec->choosing[myId] = 1;
max = 0;
for (j=0; j<MAX_THREAD; j++) {
if(max < sec->number[j]) max = sec->number[j];
}
sec->number[myId] = max + 1;
sec->choosing[myId] = 0;
for (j = 0; j < MAX_THREAD; j++) {
while (sec->choosing[j]);
while (sec->number[j] != 0 &&
(sec->number[j] < sec->number[myId] ||
(sec->number[j] == sec->number[myId] && j < myId)));
}
}
void My_LeaveCriticalSection( int myId, MY_LPCRITICAL_SECTION sec ) {
sec->number[myId] = 0;
}
DWORD WINAPI MyThreadFunction (LPVOID num);
int main()
{
HANDLE _T1,_T2,_T3;
DWORD _D1,_D2,_D3;
_T1=CreateThread(NULL,0,MyThreadFunction,(LPVOID)1,0,&_D1);
_T2=CreateThread(NULL,0,MyThreadFunction,(LPVOID)2,0,&_D2);
_T3=CreateThread(NULL,0,MyThreadFunction,(LPVOID)3,0,&_D3);
int count=1;
do
{
// Xin vào vùng tranh ch?p
EnterCriticalSection();
If thread id là 1 then
T?ng bi?n count
Else
Gi?m bi?n count
// Tr? l?i vùng tranh ch?p
LeaveCriticalSection();
}
while (1)
return 0;
}
DWORD WINAPI MyThreadFunction (LPVOID num)
{
bool go=true;
while (go)
{
printf ("Thread Number is %d%d%d\n", num,num,num);
printf("Thread Id = %d is running\n",GetCurrentThreadId());
Sleep(1000);
go=false;
}
return 0;
}
PHP Code:
/* AP 18-apr-05 bakery.h */
/* declarations for an implementation of */
/* sections based on bakery algorithm */
# ifndef __bakery_h
# define __bakery_h
typedef struct _crit_sec * MY_LPCRITICAL_SECTION;
void My_InitializeCriticalSection( MY_LPCRITICAL_SECTION * sec );
void My_DeleteCriticalSection( MY_LPCRITICAL_SECTION sec );
void My_EnterCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec );
void My_LeaveCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec );
# endif
hi