线程同步的问题急
#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
#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
...全文
相关推荐
以银行取钱为例模拟Java多线程同步问题完整代码
主要介绍了以银行取钱为例模拟Java多线程同步问题完整代码,具有一定借鉴价值,需要的朋友可以参考下。
多线程并发同步(爸爸妈妈苹果橘子问题,有界面)
图形化实现:多线程并发同步,缓冲区容量为2,爸爸放苹果,妈妈放橘子,儿子吃苹果,女儿吃橘子。 图形化实现:多线程并发同步,缓冲区容量为2,爸爸放苹果,妈妈放橘子,儿子吃苹果,女儿吃橘子。
线程同步问题
我也初学者,线程同步问题,对线程同步问题的的一些笔记
java 实现线程同步的方式有哪些
当使用多个线程来访问同一个数据时,非常容易出现线程安全问题,所以我们用同步机制来解决这些问题,本文将详细介绍,需要的朋友可以参考下
线程同步的四种方式
线程同步的四种方法的代码。事件 互斥量 信号量 临界区


