同步访问中的读写者问题(使用线程关键域)

同步访问中的读写者问题(使用线程关键域)

#include  < windows.h >
#include 
< stdlib.h >
#include 
< time.h >
#include 
< stdio.h >
struct  CRITICAL_REGION
{
public:
    CRITICAL_SECTION cs;
    
int gData;
}
;
DWORD WINAPI writer(LPVOID cr);
DWORD WINAPI reader(LPVOID cr);


int  main( int  argc, char *  argv[])
{
    DWORD targetThreadID;
    HANDLE writerThread;
    HANDLE readerThread;
    CRITICAL_REGION cr;
    cr.gData
=0;
    InitializeCriticalSection(
&(cr.cs));
    writerThread 
=CreateThread(NULL,0,writer,&cr,0,&targetThreadID);
    CloseHandle(writerThread);
    readerThread 
=CreateThread(NULL,0,reader,&cr,0,&targetThreadID);    
    CloseHandle(readerThread);
    Sleep(
10000);
    printf(
"end");
    
return 0;
}


DWORD WINAPI writer(LPVOID cr)
{
    Sleep(
1000);
    DWORD result 
= 0;
    
int n = 1;
    ExitProcess(
0);

    
while(n<=10)
    
{
        EnterCriticalSection(
&((CRITICAL_REGION*)cr)->cs);
        
if(((CRITICAL_REGION*)cr)->gData==0)
        
{
            ((CRITICAL_REGION
*)cr)->gData = n;
            printf(
"gData is %d\n",((CRITICAL_REGION*)cr)->gData);
            n
++;
        }

        LeaveCriticalSection(
&(((CRITICAL_REGION*)cr)->cs));
        Sleep(
100);

    }

    
return result;
}
;

DWORD WINAPI reader(LPVOID cr)
{
    DWORD result 
=0;
    
char u[6];
    
int n = 1;
    
while(n<=10)
    
{
        EnterCriticalSection(
&((CRITICAL_REGION*)cr)->cs);
        
if(((CRITICAL_REGION*)cr)->gData!=0)
        
{
            ((CRITICAL_REGION
*)cr)->gData = 0;
            n
++;
            printf(
"gData is taken away\n");
        }

        LeaveCriticalSection(
&(((CRITICAL_REGION*)cr)->cs));
        Sleep(
50);

    }

    DeleteCriticalSection( 
&(((CRITICAL_REGION*)cr)->cs)); 
    gets(u);
    
return result;
}
;

你可能感兴趣的:(同步访问中的读写者问题(使用线程关键域))