线程同步的问题急

shakeyou123 2009-06-07 08:47:09
#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
...全文
99 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shakeyou123 2009-07-20
  • 打赏
  • 举报
回复
不好意思了,现在才来,你说的应该是对的,我跟踪了一下每次那个线程一退出锁就释放了
fanbin23 2009-06-13
  • 打赏
  • 举报
回复
确实,前面是我看错了。
重新看了一下,我对windows线程的实现机制不是很了解,这个例子要求某一个线程获得writer_lock,并在另外一个线程中释放,不知道这种简单的mutex是否支持。我印象中pthread是不支持的,一旦一个线程退出了,那么他hold的所有资源,包括锁就被释放了。不知道是不是这个原因。
shakeyou123 2009-06-10
  • 打赏
  • 举报
回复
第一个读者结束的时候,读者3已经开始再读操作了
fanbin23 2009-06-09
  • 打赏
  • 举报
回复
又笔误了,应该是f0 f2 reader,f1 writer
fanbin23 2009-06-09
  • 打赏
  • 举报
回复
正常的行为,因为f1读者做完时f3的读者还没开始,所以f2写者就可以进行了。读者优先也不代表写者永远没有机会啊
shakeyou123 2009-06-09
  • 打赏
  • 举报
回复
忘记说了,这是读者优先的读者写者问题,读操作不需要枷锁的
mengde007 2009-06-07
  • 打赏
  • 举报
回复
读操作也要枷锁

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧