Announcement

Collapse
No announcement yet.

THực hành HĐH lap 3a

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • THực hành HĐH lap 3a

    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
    Tôi đã chọn và tôi sẽ đi bằng mọi cách.

LHQC

Collapse
Working...
X