Tình hình là mình có nghiên cứu bài lap 3a mầy ngày rùi mà vẫn chưa hiểu cách làm.
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_InitializeCriticalSectionMY_LPCRITICAL_SECTION sec ) {
    
int i;
    *
sec = (MY_LPCRITICAL_SECTIONmalloc (sizeof(struct _crit_sec));
    for(
i=0i<MAX_THREADi++) {
        (*
sec)->choosing[i] = 0;
        (*
sec)->number[i] = 0;
    }
}

void My_DeleteCriticalSectionMY_LPCRITICAL_SECTION sec ) {
    if (
secfreesec );
}

void My_EnterCriticalSectionint myIdMY_LPCRITICAL_SECTION sec ) {
    
int maxj;
    
sec->choosing[myId] = 1;
    
max 0;
    for (
j=0j<MAX_THREADj++) {
        if(
max sec->number[j]) max sec->number[j];
    }
    
sec->number[myId] = max 1;
    
sec->choosing[myId] = 0;
    for (
0MAX_THREADj++) {
        while (
sec->choosing[j]);
        while (
sec->number[j] != &&
            (
sec->number[j] < sec->number[myId] ||
            (
sec->number[j] == sec->number[myId] && myId)));
    }


void My_LeaveCriticalSectionint myIdMY_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


bakery.h:
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_InitializeCriticalSectionMY_LPCRITICAL_SECTION sec );
void My_DeleteCriticalSectionMY_LPCRITICAL_SECTION sec );

void My_EnterCriticalSectionint ThIdMY_LPCRITICAL_SECTION sec );
void My_LeaveCriticalSectionint ThIdMY_LPCRITICAL_SECTION sec );

# endif 
Mong được các sư huynh và các bạn chỉ giùm.
hi