线程同步的问题急

shakeyou123 shakeyou123 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#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
...全文
评论 7
收藏 已收藏
分享
返回顶部
shakeyou123
C++ 语言 65,214 成员 250,514 内容