线程同步的问题急
#include<iostream.h>
#include<Windows.h>
#include<string.h>
#include "MyThread.h"
int readercount=0;//读者个数
HANDLE hMutex_R_W=CreateMutex(NULL,false,"r_w");
HANDLE hMutex_ReaderCount=CreateMutex(NULL,false,"readercount");
void main()
{
/*MyThread my_thread_1(1,'R',3,5);
MyThread my_thread_2(2,'W',4,5);
MyThread my_thread_3(3,'R',5,2);
MyThread my_thread_4(4,'R',6,5);
MyThread my_thread_5(5,'W',5.1,3);*/
DWORD WINAPI Function_0(LPVOID);
DWORD WINAPI Function_1(LPVOID);
DWORD WINAPI Function_2(LPVOID);
DWORD WINAPI Function_3(LPVOID);
DWORD WINAPI Function_4(LPVOID);
HANDLE my_threads[5];
my_threads[0]=CreateThread(NULL,0,Function_0,NULL,0,NULL);
my_threads[1]=CreateThread(NULL,0,Function_1,NULL,0,NULL);
my_threads[2]=CreateThread(NULL,0,Function_2,NULL,0,NULL);
my_threads[3]=CreateThread(NULL,0,Function_3,NULL,0,NULL);
my_threads[4]=CreateThread(NULL,0,Function_4,NULL,0,NULL);
WaitForMultipleObjects(5,my_threads,TRUE,INFINITE);
cout<<"haha"<<endl;
}
DWORD WINAPI Function_0(LPVOID)
{
cout<<"线程1被创建"<<endl;
Sleep(300);
cout<<"线程1申请读操作"<<endl;
WaitForSingleObject(hMutex_ReaderCount,INFINITE);
readercount++;
if(readercount==1)
WaitForSingleObject(hMutex_R_W,INFINITE);
ReleaseMutex(hMutex_ReaderCount);
cout<<"线程1开始进行读操作"<<endl;
Sleep(500);
cout<<"线程1结束读操作"<<endl;
WaitForSingleObject(hMutex_ReaderCount,INFINITE);
readercount--;
//cout<<"1:"<<readercount<<endl;
if(readercount==0)
{
//cout<<"shit"<<1<<endl;
ReleaseMutex(hMutex_R_W);
}
ReleaseMutex(hMutex_ReaderCount);
return 0;
}
DWORD WINAPI Function_1(LPVOID)
{
cout<<"线程2被创建"<<endl;
Sleep(400);
cout<<"线程2申请写操作"<<endl;
WaitForSingleObject(hMutex_R_W,INFINITE);
//cout<<"&"<<readercount<<endl;
cout<<"线程2开始进行写操作"<<endl;
Sleep(500);
cout<<"线程2结束写操作"<<endl;
ReleaseMutex(hMutex_R_W);
return 0;
}
DWORD WINAPI Function_2(LPVOID)
{
cout<<"线程3被创建"<<endl;
Sleep(500);
cout<<"线程3申请读操作"<<endl;
WaitForSingleObject(hMutex_ReaderCount,INFINITE);
readercount++;
if(readercount==1)
WaitForSingleObject(hMutex_R_W,INFINITE);
ReleaseMutex(hMutex_ReaderCount);
cout<<"线程3开始进行读操作"<<endl;
Sleep(200);
cout<<"线程3结束读操作"<<endl;
WaitForSingleObject(hMutex_ReaderCount,INFINITE);
readercount--;
// cout<<"3:"<<readercount<<endl;
if(readercount==0)
{
//cout<<"shit"<<3<<endl;
ReleaseMutex(hMutex_R_W);
}
ReleaseMutex(hMutex_ReaderCount);
return 0;
}
DWORD WINAPI Function_3(LPVOID)
{
cout<<"线程4被创建"<<endl;
Sleep(600);
cout<<"线程4申请读操作"<<endl;
WaitForSingleObject(hMutex_ReaderCount,INFINITE);
readercount++;
if(readercount==1)
WaitForSingleObject(hMutex_R_W,INFINITE);
ReleaseMutex(hMutex_ReaderCount);
cout<<"线程4开始进行读操作"<<endl;
Sleep(500);
cout<<"线程4结束读操作"<<endl;
WaitForSingleObject(hMutex_ReaderCount,INFINITE);
readercount--;
//cout<<"4:"<<readercount<<endl;
if(readercount==0)
{
//cout<<"shit"<<4<<endl;
ReleaseMutex(hMutex_R_W);
}
ReleaseMutex(hMutex_ReaderCount);
return 0;
}
DWORD WINAPI Function_4(LPVOID)
{
cout<<"线程5被创建"<<endl;
Sleep(510);
cout<<"线程5申请写操作"<<endl;
WaitForSingleObject(hMutex_R_W,INFINITE);
// cout<<"#"<<readercount<<endl;
cout<<"线程5开始进行写操作"<<endl;
Sleep(300);
cout<<"线程5结束写操作"<<endl;
ReleaseMutex(hMutex_R_W);
return 0;
}
运行结果是
线程1申请读操作
线程1开始进行读操作
线程2申请写操作
线程3申请读操作
线程3开始进行读操作
线程5申请写操作
线程4申请读操作
线程4开始进行读操作
线程3结束读操作
线程1结束读操作
线程2开始进行写操作
线程4结束读操作
线程2结束写操作
线程5开始进行写操作
线程5结束写操作
结果存在的问题是在线程1结束读操作后线程2就进行了写操作
按照程序的逻辑应该是在线程4结束读操作后readercount==0后执行ReleaseMutex(hMutex_R_W);
然后线程2的WaitForSingleObject(hMutex_R_W,INFINITE);才有返回,才能执行,请高手们指教,另外我已经将编译选项里的MLd改成了MTd