文件的读写互斥实现有好想法的进!

lxhvc 2004-01-06 11:56:54
课程设计要做一个文件系统的读写进程互斥,不知如何下手,请教高手指点!
具体要求,随机产生读或写进程,做到:
1。“写-写”互斥
2。 “读-读”允许
3。 “读-写”互斥
...全文
317 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcforever 2004-01-07
  • 打赏
  • 举报
回复
下面是我写的一个简单的三个线程同时写一个文件的例子
1、在对话框的头文件中定义如下函数和变量
static unsigned __stdcall ThreadThird(LPVOID lparam);
static unsigned __stdcall ThreadTwo(LPVOID lparam);
static unsigned __stdcall ThreadOne(LPVOID lparam);
unsigned hThreadOneId;
unsigned hThreadTwoId;
unsigned hThreadThirdId;
HANDLE hThread[3];
CStdioFile file;
HANDLE hMutex;
2、在OnInitDialog()中打开一个文件,用于三个线程同时写入
//打开文件
if(!file.Open("C:\\test.txt",CFile::modeRead | CFile::modeWrite))
file.Open("C:\\test.txt",CFile::modeRead | CFile::modeWrite | CFile::modeCreate);

3、在一个按钮函数中启动三条线程
//按钮函数
//start three thread
void CMultithreadDlg::OnBtnstart()
{
hMutex = ::CreateMutex(NULL,FALSE,NULL);
hThread[0] = (HANDLE)_beginthreadex(NULL,0,ThreadOne,this,0,&hThreadOneId);
hThread[1] = (HANDLE)_beginthreadex(NULL,0,ThreadTwo,this,0,&hThreadTwoId);
hThread[2] = (HANDLE)_beginthreadex(NULL,0,ThreadThird,this,0,&hThreadThirdId);

WaitForMultipleObjects(3,hThread,TRUE,INFINITE);
for(int i = 0; i < 3; i++)
CloseHandle(hThread[i]);
ReleaseMutex(hMutex);
CloseHandle(hMutex);
MessageBox("all thread finished!\n and Mutex has released success",
"Notice",
MB_ICONINFORMATION | MB_OK);
}
下面是三个线程函数,用于向文件中写入数据
//第二条线程
unsigned __stdcall CMultithreadDlg::ThreadTwo(LPVOID lparam)
{
CMultithreadDlg *pSDlg = (CMultithreadDlg*)lparam;

pSDlg->file.SeekToEnd();
for(int i = 10; i < 20; i++){
WaitForSingleObject(pSDlg->hMutex,INFINITE);
char temp[10] = {0};
itoa(i,temp,10);
strcat(temp,"\n");
pSDlg->file.WriteString(temp);
ReleaseMutex(pSDlg->hMutex);
}

return 0;
}
//第三条线程
unsigned __stdcall CMultithreadDlg::ThreadThird(LPVOID lparam)
{
CMultithreadDlg *pTDlg = (CMultithreadDlg*)lparam;

pTDlg->file.SeekToEnd();
for(int i = 20; i < 30; i++){
WaitForSingleObject(pTDlg->hMutex,INFINITE);
char temp[10] = {0};
itoa(i,temp,10);
strcat(temp,"\n");
pTDlg->file.WriteString(temp);
ReleaseMutex(pTDlg->hMutex);
}

return 0;
}
在对话框关闭的时候关闭文件
void CMultithreadDlg::OnClose()
{
file.Close();
CDialog::OnClose();
}

上面只是一个简单测试多条线程向同一文件中同时写入时的同步,读文件的方法和写的一样,只要处理好同步就可以了!

希望对楼主有所帮助!
sharkhuang 2004-01-07
  • 打赏
  • 举报
回复
solaris和java现在都支持写优先多读单写锁!完全符合你的要求!呵呵
Semigod 2004-01-07
  • 打赏
  • 举报
回复
其实在Windows平台下,打开文件时,只要是ShareRead方式打开就可以像你所说的那样操作了,系统会自动实现你所谓的互斥功能的
victor_cui 2004-01-07
  • 打赏
  • 举报
回复
这是一个典型的读写锁实现的案例,对于unix或者linux平台,我们可是使用phtread_rwlock_t来实现线程间的互斥锁,配合共享内存就可以实现进程间互斥了
而对于windows平台则可以通过内核对象Mutex或者信号量实现自己的读写锁。
这样就可以把你的文件操作和读写锁封装在一起,实现一个你自己的文件操作类了

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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